我目前正在研究一个涉及外部合并选项的项目,该项目使用替换选择和K-Way合并。我已经在C ++中实现了该项目[在Linux上运行]。它非常简单,现在仅处理固定尺寸的记录。

对于阅读和写作,我使用(I/O)FSTREAM类。在执行几次迭代后,我注意到

  • I/O读取大小超过4K(典型块大小)的请求的块。实际上给出大于4K的缓冲尺寸会导致性能降低。
  • 输出操作似乎不需要缓冲,Linux似乎负责缓冲输出。因此,我发布了写(记录),而不是维护写入的特殊缓冲区,然后使用Write(Records [])立即冲洗它们。

但是该应用程序的性能似乎并不是很棒。我如何提高性能?我应该维护特殊的I/O线程以照顾阅读块,还是已经提供此抽象的现有C ++类?

有帮助吗?

解决方案

如此高性能I/O最简单完成 mmap. 。这为内核提供了更大的自由执行I/O,并为您的应用程序安排CPU时间。例如,当您使用ifstream读取1 MB时,只有在读取所有数据时,内核才能返回。但是,使用MMAP(),可以在可用时逐渐返回数据。

但是,您应该了解如何发生。仅仅因为数据似乎在RAM中并不意味着您应该将其视为随机访问。不要喂 std::sort. 。这将接触MMAP'ED区域的随机部分,从而导致左右中间的页面故障。结果,您将引起重型磁盘寻求解决随机页面故障。反而, mmap() 两个输入并将其合并。因为MMAP命令告诉内核您将来需要什么数据,所以内核将尽快为您提供数据,并且当您的合并排序暂时不含数据时,您的合并排序将为故障(即失速)。

其他提示

查看使用C低级别IO库。http://www.linuxtopia.org/online_books/programming_books/gnu_libc_guide/low_002dlevel-i_002fo.html或者ftp://ftp2.developpez.be/developps/linux/alp/alp-papb-low-level-level-io.pdf

在很久以前的Windows中,我有一些IO使用低级IO打开的速度比使用Fopen快10倍。

也许您不会获得相同的性能好处,我知道这将是一些。

与Plain-C I/O相比,溪流以其性能问题而闻名。实际上,它们充当“易于使用,适合不同情况”,但缺乏性能。在您的情况下,我将要做的是改用C风格的I/O,根据分析结果进行分析,然后采取行动。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top