gpt4 book ai didi

c++ - 提高 C++ 程序中的 I/O 性能[外部归并排序]

转载 作者:搜寻专家 更新时间:2023-10-31 00:22:56 25 4
gpt4 key购买 nike

我目前正在从事一个涉及使用替换选择和 k 向合并的外部合并排序的项目。我已经用 C++ [在 linux 上运行] 实现了这个项目。它非常简单,现在只处理固定大小的记录。

对于阅读和写作,我使用 (i/o)fstream 类。在执行程序几次迭代后,我注意到

  • I/O 读取大小超过 4K(典型 block 大小)的请求的 block 。事实上,提供大于 4K 的缓冲区大小会导致性能下降。
  • 输出操作似乎不需要缓冲,linux 似乎负责缓冲输出。所以我发出一个 write(record) 而不是维护特殊的写入缓冲区,然后使用 write(records[]) 立即将它们刷新出来。

但是应用的性能似乎不是很好。我怎样才能提高性能?我应该维护特殊的 I/O 线程来处理读取 block ,还是现有的 C++ 类已经提供了这种抽象?(类似于 java 中的 BufferedInputStream)

最佳答案

这种高性能的 I/O 最容易用 mmap 完成。这为内核提供了更多的自由来执行 I/O 并为您的应用程序安排 CPU 时间。比如你用ifstream读入1MB,内核只有读完所有数据才能返回。但是使用 mmap(),数据可以在可用时递增地返回。

但是,您应该了解这是如何发生的。仅仅因为数据似乎在 RAM 中并不意味着您应该将其视为随机可访问。不要将它提供给 std::sort。这将触及 mmap 区域的随机部分,导致左右和中心页面错误。结果,您将导致大量磁盘试图解决随机页面错误。相反,mmap() 两个输入并将它们合并。因为 mmap 命令告诉内核您将来需要什么数据,内核将尽可能快地为您提供数据,而您的合并排序将在暂时没有数据时出现页面错误(即停止)。

关于c++ - 提高 C++ 程序中的 I/O 性能[外部归并排序],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com