gpt4 book ai didi

c++ - 从文件加载信息时出现问题

转载 作者:行者123 更新时间:2023-11-28 01:07:20 24 4
gpt4 key购买 nike

我有疑问。我正在编写代码以将信息从文件加载到计算机内存中。但根据文件“格式”的不同,所需时间也大不相同。

让我解释得更好。在我正在阅读的文件中,我有一种表格,其中包含用“|”分隔的随机字符串。这里有一个表格示例(5 行和 5 列)。

Table.txt

0|42sKuG^uM|24465\lHXP|2996fQo\kN|293cvByiV
1|14772cjZ`SN|28704HxDYjzC|6869xXj\nIe|27530EymcTU
2|9041ByZM]I|24371fZKbNk|24085cLKeIW|16945TuuU\Nc
3|16542M[Uz\|13978qMdbyF|6271ait^h|13291_rBZS
4|4032aFqa|13967r^\\`T|27754k]dOTdh|24947]v_uzg

我的疑问是,如果表有 100.000 行和 100 列,或者如果它有 100 行和 100.000 列(在最后一种情况下,时间要长得多)。实际上,访问此信息所花费的时间也比其他情况多。

那么疑惑就是,如果表的大小一样,为什么这次会相差这么大???

这里是从文件中读取此信息并将其存储在计算机中的代码部分。

从 Table.txt 文件中读取数据并将其存储在计算机内存中的代码

string ruta_base("C:\\a\\Table.txt"); // Folder where my "Table.txt" is found

string temp; // Variable where every row from the Table.txt file will be firstly stored
vector<string> buffer; // Variable where every different row will be stored after separating the different elements by tokens.
vector<ElementSet> RowsCols; // Variable with a class that I have created, that simulated a vector and every vector element is a row of my table (vector<string> buffer)

ifstream ifs(ruta_base.c_str());

while(getline( ifs, temp )) // We will read and store line per line until the end of the ".txt" file.
{
size_t tokenPosition = temp.find("|"); // When we find the simbol "|" we will identify different element. So we separate the string temp into tokens that will be stored in vector<string> buffer

while (tokenPosition != string::npos)
{
string element;
tokenPosition = temp.find("|");

element = temp.substr(0, tokenPosition);
buffer.push_back(element);
temp.erase(0, tokenPosition+1);
}

ElementSet ss(0,buffer);
buffer.clear();
RowsCols.push_back(ss); // We store all the elements of every row (stores as vector<string> buffer) in a different position in "RowsCols"
}

vector<Table> TablesDescriptor;

Table TablesStorage(RowsCols);
TablesDescriptor.push_back(TablesStorage);

DataBase database(1, TablesDescriptor);

在这里,我添加了我根据您的所有反馈所做的解决方案

string ruta_base("C:\\a\\Table.txt"); // Folder where my "Table.txt" is found

string temp; // Variable where every row from the Table.txt file will be firstly stored
vector<string> buffer; // Variable where every different row will be stored after separating the different elements by tokens.
vector<ElementSet> RowsCols; // Variable with a class that I have created, that simulated a vector and every vector element is a row of my table

ifstream ifs(ruta_base.c_str());

while(getline( ifs, temp )) // We will read and store line per line until the end of the ".txt" file.
{
size_t tokenPosition = temp.find("|"); // When we find the simbol "|" we will identify different element. So we separate the string temp into tokens that will be stored in vector<string> buffer

const char* p = temp.c_str();
char* p1 = strdup(p);

char* pch = strtok(p1, "|");
while(pch)
{
buffer.push_back(string(pch));
pch = strtok(NULL,"|");
}
free(p1);

ElementSet sss(0,buffer);
buffer.clear();
RowsCols.push_back(sss);
}

vector<Table> TablesDescriptor;

Table TablesStorage(RowsCols);
TablesDescriptor.push_back(TablesStorage);

DataBase database(1, TablesDescriptor);

最佳答案

您没有发布某些代码(例如 ElementSet)的实现,但即使在我们可以看到的情况下,也有一些操作消耗的时间随着文件中当前行的长度线性增加,例如

temp.erase(0, tokenPosition+1);

如果不一直从字符串的开头删除位会更有效 - 这会强制通过内存不断复制整行 100,000 个字段,压缩回字符串的开头。相反,跟踪您当前提取的位置,并从该偏移量开始下一次搜索,同时使用该偏移量进行 substr() 操作。如果你开始从内存内容的角度思考问题,你就会学会分析这类问题。还可以使用分析器向您显示哪些特定代码行速度较慢。

关于c++ - 从文件加载信息时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5458235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com