在我的当前项目中,我正在处理大量数据,这些数据是通过“while”循环实时生成的。我想将数据写入CSV文件,但我不知道哪种方法更好 - 是将所有值存储在向量数组中并在最后写入文件,还是每次迭代都写入?
我认为第一个选择更好,但如果可能的话,我希望得到一个详细的答案。谢谢。
我认为第一个选择更好,但如果可能的话,我希望得到一个详细的答案。谢谢。
确保您使用启用缓冲的I/O库,然后在每次迭代时写入。
这样,您的计算机可以开始与其余计算并行进行磁盘访问。
附注:不要做任何疯狂的事情,例如在每次写入后刷新,或在每次迭代时打开和关闭文件。这会降低效率。
flush
和endl
,ofstream
确实具有缓冲功能。但是它的开销比fopen
+fprintf
大得多。如果您不需要特定于区域设置的格式(CSV旨在供计算机读取,因此通常也不需要),那么我肯定建议使用fprintf
。 - Ben Voigt写入文件的最有效方法是减少写操作次数并增加每个操作写入的数据量。
给定一个512字节的字节缓冲区,最低效的方法是一次写入512字节,一次写操作。更有效的方法是进行一次操作以写入512字节。
每次调用写入文件都会有开销。这种开销包括在其目录中定位驱动器上的文件、寻找驱动器上的新位置和写入。实际的写入操作非常快;浪费时间的是寻找并等待硬盘旋转并准备好。因此,让它旋转一次,通过写入大量内容来保持旋转状态,然后让它停止旋转。当盘片旋转时写入的数据越多,写入就越有效率。
我建议将格式化后的内容写入文本缓冲区(即512的倍数),并在某些点将缓冲区刷新到硬盘上。(512字节是硬盘上常见的扇区大小倍数)。
如果你喜欢线程,可以创建一个监视输出缓冲区的线程。当输出缓冲区达到阈值时,线程将内容写入驱动器。多个缓冲区可以通过让快速处理器填充缓冲区,同时将其他缓冲区写入慢速驱动器来提高效率。最简单的方法是在控制台中使用 > 运算符。在 Linux 中:
./miProgram > myData.txt
这将获取程序的输入并将其放入文件中。
对于英语不好的人表示抱歉 :)
fopen
和fprintf
会比ofstream
更快,这时std::endl
就不是问题了。 - Ben Voigt