在C++中异步保存大块二进制文件的最佳方法



我正在开发一个C++应用程序,它的输出是一个大的二进制文件(几个GB,基本上是一个很大的浮点序列(。该文件的内容是由并行进程异步生成的。

每次进程结束时,其结果都必须保存到磁盘二进制文件中的相应位置(进程结束的顺序不一定与结果存储在磁盘中的顺序相对应。大约需要5个进程才能获得输出的完整数据(。

在C++中实现这一点的最佳方法是什么?我有几个可行的解决方案,但也许它们可以在最大限度地减少磁盘使用方面得到改进:

  • 为每个完成的过程保存单独的文件,然后合并
  • 使用seekp((为每个保存操作保持fstream打开并定位put指针

如果可以避免的话,我不建议在写入临时文件和合并上浪费时间。

序列化到单个进程/单个流可能会快得多。但一定要在一些至少64KB的块中进行查找和写入,以减少开销。

我根本不会使用fstream,因为它们会带来一些开销(而且您依赖于实现的质量,如1、2、3、4中所示(。最好只使用fopen,禁用缓冲,并以64KB+的块进行写入。

为了获得更好的性能,可以使用内存映射I/O,例如使用Boost.Iostreams(示例(。您也可以从多个进程进行内存映射。

如果独立进程生成的片段是4KB或更大的倍数,在大多数操作系统上,您可以在每个进程中打开同一个文件,找到所需的位置并进行写入(不太便携,但在Linux、BSD和Win32上可以(。在Win32上,只需要相应地设置文件共享模式。

最新更新