几个ifstreams与ifstream +不断寻求

时间:2010-04-20 13:04:16

标签: c++ ifstream external-sorting

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

2 个答案:

答案 0 :(得分:2)

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

对于C ++异步IO库,请查看this question

编辑:我最初误解了你要做的事情(这个Wikipedia article填补了我)。我不知道默认情况下有多少ifstream缓冲区,但您可以使用pubsetbuf(0, 0);方法described here关闭缓冲,然后自行缓冲。然而,这可能比使用具有自动缓冲的多个ifstream更慢。一些基准测试是有序的。

答案 1 :(得分:1)

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

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

请注意,一个进程可以同时打开文件的数量可能会有限制(ulimit -n)。如果你达到了,那么你可能想考虑使用单个流,但是手动缓冲每个k块的数据。

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