是否有一种方法而不是对csv中的每一行使用getline(),而是读入一个更大的块,比如将一行写入一个字符串?然后想法是编写将字符串拆分为子串/将元素分成所需数组/向量的代码。
目前加载csvs(50-1500mb)需要5分钟++,从拖网相关问题来看,似乎瓶颈是调用getline()/系统调用是什么导致缓慢?
我是一个c ++ newb,所以如果有人知道更好的解决方案,我们将不胜感激!
如果它有帮助,这是我当前的慢代码:
while (!myFile.eof())
{
string aLine; //holds in read in line
getline(myFile, aLine); //reads line from file into aLine
std::string input = aLine;
std::istringstream ss(input);
std::string token;
while (std::getline(ss, token, ',')) {
t++;
if (t == 2) {
y.push_back(0);
y[i] = atof(token.c_str());
cout << y[i] << endl;
}
}
t = 0;
i++;
}
编辑:感谢John Zwinck,时间从232.444秒减少到156.248秒。还要感谢Richard Critten,我将使用boost来更新使用内存映射所用的时间。
答案 0 :(得分:2)
代码中最大的性能问题是严重性:
t == 2
之后未发生短路。cout
(依赖于平台)。{/ li>
这样的事情应该快得多:
y.reserve(1000);
for (string aLine; getline(myFile, aLine); ) {
string::size_type comma = aLine.find(',');
if (comma == string::npos)
continue;
y.push_back(atof(aLine.c_str() + comma + 1));
cout << y.back() << '\n';
}