【发布时间】:2012-06-06 16:20:16
【问题描述】:
我有一个软件可以执行一组实验 (C++)。 如果不存储结果,所有实验都需要一分钟多一点的时间。 生成的总数据量为 2.5 GB,太大了,无法在实验结束前存储在内存中,然后再写入文件。 所以我把它们写成块。
for(int i = 0; i < chunkSize;i++){
outfile << results_experiments[i] << endl;
}
在哪里 ofstream outfile("数据"); 并且 outfile 只在最后关闭。
但是,当我将它们写入 4700 KB 的块(实际上是 4700/Chunksize = results_experiments 元素的大小)时,实验需要的时间大约长 50 倍(超过一个小时......)。这是不可接受的,并且使我之前的优化尝试看起来相当愚蠢。特别是因为这些实验再次需要使用许多不同的参数设置等进行。(至少 100 次,但最好更多)
具体我的问题是:
理想的块大小是多少?
有没有比我目前写入数据的方式更有效(或效率非常低的方式)?
基本上:帮助我尽可能少地引入文件 IO 开销..
我认为应该可以更快地完成此操作,因为复制(写入和读取!)生成的文件(相同大小)需要我不到一分钟的时间..
代码应该完全独立于平台,并且不使用任何(非标准)库(我可以为单独的平台提供单独的版本和更复杂的安装说明,但这很麻烦..) 如果在没有平台/库依赖(并且可能有)的情况下将总实验时间控制在 5 分钟以下是不可行的,我会认真考虑引入这些。 (平台是windows,但至少应该有一个简单的linux端口)
感谢您的努力。
【问题讨论】:
-
每个
endl都会刷新缓冲区。你不想要那个。使用<< '\n'。 -
没有人能告诉你理想的 I/O 块大小是多少——这取决于太多因素,包括硬件因素。进行试验,直到找到适合您系统的那个。您仍然可以通过重叠计算和 I/O 来隐藏一些 I/O 延迟 - 在当前计算正在进行时写入前一个计算的结果。
-
但是,我们可以告诉您,大多数 32 位窗口在 4k 的块大小下都可以很好地工作。
-
尝试
fprintf而不是 iostreams。 iostream 非常慢。 stackoverflow.com/questions/4340396/…
标签: c++ c performance file file-io