我正在写一个外部合并排序。它的工作原理如下:从大文件中读取k块,在内存中对它们进行排序,执行k-way merge,完成。所以我需要在k-way合并阶段顺序读取文件的不同部分。最好的方法是什么:几个ifstreams或一个ifstream并寻求?另外,是否有一个易于异步IO的库?
答案 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块的数据。
如果文件足够小(相当于:您的地址空间足够大),可能值得对文件进行映射并使用多个指针。