在生成数据时写入数据的最快方法

Fia*_*Lux 7 c++ parallel-processing optimization file-io

在我的程序中,我正在模拟大量迭代的N体系统.对于每次迭代,我生成一组6N坐标,我需要将其附加到文件,然后用于执行下一次迭代.代码是用C++编写的,目前使用ofstream的方法write()在每次迭代时以二进制格式写入数据.

我不是这个领域的专家,但我想改进这部分程序,因为我正在优化整个代码.我觉得与在每个周期写入计算结果相关的延迟会显着降低软件的性能.

我很困惑,因为我没有实际并行编程和低级文件I/O的经验.我想到了一些我想象的可以实现的抽象技术,因为我正在使用Unix操作系统编写现代(可能是多核)的机器:

  • 在n次迭代的块中写入文件中的数据(似乎有更好的方法继续......)
  • 使用OpenMP并行化代码(如何实际实现缓冲区以使线程正确同步,并且不重叠?)
  • 使用mmap(文件大小可能很大,按GB的顺序,这种方法足够强大吗?)

但是,我不知道如何最好地实施它们并适当地组合它们.

Off*_*rmo 3

当然,每次迭代写入文件的效率很低,并且很可能会减慢计算速度。(根据经验,取决于您的实际情况)

\n\n

您必须使用生产者->消费者设计模式。它们将通过队列连接起来,就像传送带一样。

\n\n
    \n
  • 生产者将尝试尽可能快地生产,只有在消费者无法处理时才会减慢速度。
  • \n
  • 消费者会尝试尽快“消费”。
  • \n
\n\n

通过将两者分开,您可以更轻松地提高性能,因为每个过程都更简单并且彼此之间的干扰更少。

\n\n
    \n
  • 如果生产者更快,您需要改进消费者,在您的情况下,通过以最有效的方式写入文件,最有可能逐块写入文件(正如您所说)
  • \n
  • 如果消费者速度更快,您需要改进生产者,最有可能的方法是像您所说的那样将其并行化。
  • \n
\n\n

没有必要同时优化两者。只优化最慢的(瓶颈)。

\n\n

实际上,您使用线程和它们之间的同步队列。有关实现提示,请查看此处,尤其是 \xc2\xa718.12“生产者-消费者模式”。

\n\n

关于流管理,您必须通过选择“最大队列大小”并在队列没有足够空间时让生产者等待来增加一点复杂性。然后小心死锁,仔细编码。(请参阅我给出的维基百科链接)

\n\n

注意:使用 boost 线程是个好主意,因为线程不太可移植。(嗯,它们是从 C++0x 开始的,但 C++0x 的可用性还不是很好)

\n

  • @Fiat Lux好吧,如果您生成数据的速度比存储在文件系统上的速度快,那么您就会遇到一个非常基本的问题,完全独立于您所做的任何软件技巧。如果您的带宽太小,迟早您会耗尽缓冲区空间,然后无论如何您都必须处理这种情况。 (2认同)