在windows 10下用c ++在csv文件中快速保存向量

Met*_*ron 0 c++ csv

我的程序读取一个文件,处理它并将结果保存在一个csv文件中。我们整个人都包含一个循环,其中处理了许多不同的文件。为每个文件生成一个单独的 csv 文件。我能够在时间方面非常有效地实现处理,因此保存各自的结果是循环中最长的过程。结果可用,vector <float>目前保存如下:

    std::vector<float*> out = calculation(bla);

    fstream data;
    data.open(savepfad + name + ".csv", ios::out);
    data<< sizex << endl;
    data<< sizey << endl;
    data<< dim << endl;

    for (int d = 0; d < dim; d++)
    {       
        for (int x = 0; x < sizex * sizey; x++)
        {
            data << out[d][x] << ",";
        }
        data << endl;
    }
    data.close();
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是,我可以简单地将存储过程外包给一个新线程(可能使用 fork),这样我就可以继续主循环。但是我用的是窗户。我可以以某种方式更快地将数据写入硬盘驱动器吗?有没有人有一个绝妙的主意?

编辑: 所以我根据声明重建了代码,但没有真正的速度优势。代码现在看起来像这样:

    std::vector<float*> out = calculation(bla);

    string line =  std::to_string(sizex) + "\n" + std::to_string(sizey ) + "\n" + std::to_string(dim) + "\n";

    for (int d = 0; d < dim; d++)
    {       
        for (int x = 0; x < sizex * sizey; x++)
        {
            line += out[d][x];
            line += ",";
        }
        line += "\n";
    }
    fstream data;
    data.open(savepfad + name + ".csv", ios::out);
    data<<line;
    data.close();
Run Code Online (Sandbox Code Playgroud)

我还注意到如果 out [] [] = 0 hours :: to_string (out [] []) 使 0 从 0.00 到 0.000000,并且 data << out [] [] 只将 0 写入文件。这使得文件大小从 8000KB 到 36000KB。因此,如果我可以在 python 中将准即时 100MB 转储到硬盘上,我必须能够相对快速地写入 8000KB,目前需要 1 到 2 分钟。

示例尺寸:

sizex = 638
sizey = 958
dim = 8
Run Code Online (Sandbox Code Playgroud)

时间测量显示,通过这两个循环几乎需要整个时间。它是一个由数组组成的向量。是不是访问out太慢了?

Bot*_*tje 5

data << endl发送换行符并将结果刷新到磁盘。你可以做

data << "\n";
Run Code Online (Sandbox Code Playgroud)

而是在不刷新的情况下发送换行符。最终结果是您刷新的次数更少,这意味着您等待操作系统的时间更少。

如果这仍然不够快,请考虑将所有内容缓冲到 a 中,ostrstream然后data一次性将其转储。

  • 我特别认为 `std::endl` 是一个很大的性能泄漏。在我审查了我们自己的 XML 编写器并将 `std::endl` 替换为 `'\n'` 后,我们在保存(不是那么小的)XML 文件方面获得了很大的加速。而且,[关于 `std::endl` 的注释](https://en.cppreference.com/w/cpp/io/manip/endl#Notes) 也可能值得一提。 (5认同)