C++写入csv,性能

Mat*_*son 4 c++ csv performance

这可能是一个简单的问题,但我一直没能找到这个具体的信息,或以可读格式ATLEAST信息.我发现的大部分信息都与从.csv中读取数据有关.

我有一个必须将数据保存到.csv文件的函数.从性能角度来看,这不是一种理想的格式,但我们假设这不会改变.我的数据存储在rxcxs数据结构中,必须以r,c,s,value的形式输出并保存到.csv中.目前我有:

char delimiter = ',';
ofstream ofs(file, ofstream::out);

for (int r = 0; r < P.n_rows; r++)
{
    for (int c = 0; c < P.n_cols; c++)
    {
        for (int s = 0; s < P.n_slices; s++)
        {
            ofs << r + 1 << delimiter << c + 1 << delimiter << s + 1 << delimiter << P(c, s, s) << endl;
            count++;
        }
    }
}
ofs.close();
Run Code Online (Sandbox Code Playgroud)

对于大小为100 x 100 x 50的数据结构,这大约需要6秒,我所需要的是很长时间.如果你能提供一些如何提高速度的信息,我将不胜感激.

Ami*_*ory 12

您应该注意,这endl不仅仅是换行符 - 它实际上数据刷新到磁盘.

将换行符插入到输出序列os中并将其刷新,就像调用os.put(os.widen('\n'))后跟os.flush()一样.

这可能会大大减慢速度.你应该尝试用换行符替换它.

  • 更深入的原因为什么它更快:刷新意味着立即将数据发送到流目标,但写入硬盘非常慢,因此文件流使用缓冲来首先收集RAM中的数据并更少地推送更大的块.这些块甚至可以调整到适合硬盘驱动器的尺寸.甚至清除缓冲区可能会花费一些成本.最好让流使用完全缓冲区冲洗并关闭.标准流总是刷新,因为用户期望在没有进一步等待的情况下也看到数据. (3认同)