3

我正在写一个外部合并排序。它的工作原理是这样的:从大文件中读取 k 个块,在内存中对它们进行排序,执行 k 路合并,完成。所以我需要在 k-way 合并阶段从文件的不同部分顺序读取。最好的方法是什么:几个 ifstream 或一个 ifstream 和寻找?另外,是否有一个易于异步 IO 的库?

4

2 回答 2

2

在同一个文件上一次使用一个ifstream。不止一个会浪费资源,而且无论如何您都必须寻找(因为默认情况下,ifstream的文件指针从文件的开头开始)。

至于 C++ 异步 IO 库,请查看这个问题

编辑:我最初误解了你想要做的事情(这篇维基百科文章填满了我)。我不知道默认有多少缓冲,但是你可以使用这里描述的方法ifstream关闭缓冲,然后自己做缓冲。但是,这可能比使用带自动缓冲的多个 s 慢。一些基准测试是有序的。pubsetbuf(0, 0);ifstream

于 2010-04-20T13:09:28.157 回答
1

绝对尝试多个流。寻找可能会丢弃内部缓冲的数据(至少在进程中,即使操作系统将其保留在缓存中),并且如果您正在排序的项目很小,那确实可能非常昂贵。

无论如何,比较两个 fstream 策略的性能应该不会太难。用 k = 2 做一个简单的实验。

请注意,一个进程可以同时打开的文件的数量可能存在限制 ( ulimit -n)。如果您达到了这一点,那么您可能需要考虑使用单个流,但手动缓冲来自每个 k 块的数据。

如果文件足够小(相当于:您的地址空间足够大),则可能值得映射文件并使用多个指针。

于 2010-04-20T13:25:01.907 回答