【发布时间】:2019-11-26 01:58:40
【问题描述】:
我有一个超过 13 列的以竖线分隔的数据文件。总文件大小超过 100 MB。我正在阅读每一行,将字符串拆分为std::vector<std::string>,以便进行计算。我对文件中的所有行重复此过程,如下所示:
string filename = "file.dat";
fstream infile(filename);
string line;
while (getline(infile, line)) {
string item;
stringstream ss(line);
vector<string> splittedString;
while (getline(ss, item, '|')) {
splittedString.push_back(item);
}
int a = stoi(splittedString[0]);
// I do some processing like this before some manipulation and calculations with the data
}
然而,这非常耗时,而且我很确定这不是读取 CSV 类型文件的最优化方式。如何改进?
更新
我尝试使用 boost::split 函数而不是 while 循环,但它实际上更慢。
【问题讨论】:
-
您总是可以使用专门用于读取 CSV 的库
-
对于开始将
std::vector声明移出 while 循环并改为在循环内清除。或者,如果列数始终相同,您可以使用std::array(也在循环外声明)。就像已经建议的那样,使用 csv 库是最好的选择。为什么要重新发明轮子? -
这里的“非常耗时”是什么意思?您需要达到的性能是什么?行是否独立,以便可以并行进行处理?
-
我想不出更好的方法,我个人会和你的编码一样。
-
CSV 读取起来非常简单,以至于读取它仅受媒体速度的限制,即使是最快的 SSD。因此,您的问题可能在于在紧密循环中创建动态对象,以及类似的其他处理,并且这一切都在调试构建中进行测量。
标签: c++ string performance optimization vector