Ale*_*ara 7 c c++ optimization performance
我一直在网上搜索这个问题,尽管在C/C++中有许多关于读/写的类似问题,但我还没有找到关于这个特定任务的信息.
我希望能够读取多个文件(256×256文件)只sizeof(double)字节位于每个文件的某个位置.现在我的解决方案是,对于每个文件:
打开文件(读取,二进制模式):
fstream fTest("current_file", ios_base::out | ios_base::binary);
寻找我想读的位置:
fTest.seekg(position*sizeof(test_value), ios_base::beg);
读取字节:
fTest.read((char *) &(output[i][j]), sizeof(test_value));
并关闭文件:
fTest.close();
这需要350 ms在for{ for {} }具有256x256次迭代的结构内运行(每个文件一个).
问:您认为有更好的方法来实施此操作吗?你会怎么做?
也许线程会有所帮助。
但首先你可以尝试一些更简单的事情。将程序制作两份副本,一份读取前 32768 个文件,另一份读取后半部分。同时运行两个程序。这需要不到 14 小时吗?
如果没有,那么添加线程可能是没有用的。正如 roygiv 上面建议的那样,进行碎片整理可能会有所帮助。
补充:14 小时显然是错误的,因为这几乎是每个文件 1 秒。Alejandro 上面的评论说,使用固态硬盘,每个文件的时间仅为 0.1 毫秒,总计 6.5 秒。这对我来说似乎很快。
所以我猜测 Alejandro 必须重复此操作大约 7000 次,每次都使用 65536 个文件中的不同数据片段。如果是这样,还有两条建议:
编写一个程序将文件转移到新文件中。您的 SSD 上可能有足够的空间来执行此操作,因为您的另一个 SO 问题表明有 32 GB 的数据,而 SSD 可能是该数据的几倍。然后每次运行仅使用这个单个大文件,这会删除 65535 个打开和关闭的文件。
而且,在创建大文件时,您可以“反转行和列”或“条带化数据”,而不只是串联,从而提供局部性。
进一步补充:您可能已经考虑过这一点,用您的短语“将读取的数据写入单个文件”。