【发布时间】:2022-01-10 12:53:05
【问题描述】:
我创建了这段代码来读取和过滤我的 csv 文件。 它就像我希望它适用于小文件一样。 但是我刚刚尝试了一个 200k 行大小的文件,大约需要 4 分钟,这对于我的用例来说太长了。
在进行了一些测试并修复了一些非常愚蠢的事情之后,我将时间缩短到了 3 分钟。 我发现大约一半的时间用于读取文件,一半的时间用于生成结果向量。
有什么方法可以提高我的程序的速度吗? 特别是从csv部分读取? 我现在真的没有想法。 如有任何帮助,我将不胜感激。
编辑:过滤器通过时间帧或时间帧和特定列中的过滤词过滤数据,并将数据输出到字符串的结果向量中。
我的 CSV 文件如下所示->
标题是:
ID;Timestamp;ObjectID;UserID;Area;Description;Comment;Checksum
数据是:
523;19.05.2021 12:15;####;admin;global;Parameter changed to xxx; Comment;x3J2j4
std::ifstream input_file(strComplPath, std::ios::in);
int counter = 0;
while (std::getline(input_file, record))
{
istringstream line(record);
while (std::getline(line, record, delimiter))
{
record.erase(remove(record.begin(), record.end(), '\"'), record.end());
items.push_back(record);
//cout << record;
}
csv_contents[counter] = items;
items.clear();
++counter;
}
for (int i = 0; i < csv_contents.size(); i++) {
string regexline = csv_contents[i][1];
string endtime = time_upper_bound;
string starttime = time_lower_bound;
bool checkline = false;
bool isInRange = false, isLater = false, isEarlier = false;
// Check for faulty Data and replace it with an empty string
for (int oo = 0; oo < 8; oo++) {
if (csv_contents[i][oo].rfind("#", 0) == 0) {
csv_contents[i][oo] = "";
}
}
if ((regex_search(starttime, m, timestampformat) && regex_search(endtime, m, timestampformat))) {
filtertimeboth = true;
}
else if (regex_search(starttime, m, timestampformat)) {
filterfromstart = true;
}
else if (regex_search(endtime, m, timestampformat)) {
filtertoend = true;
}
}
【问题讨论】:
-
欢迎来到 SO。您应该尝试更清楚地描述您的问题,并分享最少的可重现代码,而不仅仅是转储您的所有代码并期望我们通读并尝试理解您正在尝试的内容[尤其是当代码如此冗长时 :-) ],看看minimal example
-
您是否尝试在其上运行 valgrind 以查看哪些功能需要花费大量时间?仅从我怀疑
regex_search的代码来看很慢 -
您的代码也缺少
isDateInRange、isDateLater和isDateEarlier。将几乎所有东西都放在一个大函数中的一个问题是,隔离和调试/增强程序的特定部分变得复杂。我建议您创建一个class来保存 CSV 文件中一条记录的字段。 -
如果您为 CSV 文件中的所有字段提供实际名称也会有所帮助。它会让它更容易理解。另外,请描述过滤器应该做什么。
-
csv_contents[counter] = items;->csv_contents[counter] = std::move(items);会避免复制,以同样的方式:items.push_back(std::move(record));。