如何同时加载大块csv而不是使用getline?

时间:2016-07-10 09:33:44

标签: c++

是否有一种方法而不是对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来更新使用内存映射所用的时间。

1 个答案:

答案 0 :(得分:2)

代码中最大的性能问题是严重性:

  • 内存分配过多。
  • 不必要地使用stringstream。
  • 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';
}