代码之家  ›  专栏  ›  技术社区  ›  SpyBot

几个ifstreams与ifstream+常量搜索

  •  3
  • SpyBot  · 技术社区  · 14 年前

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

    2 回复  |  直到 12 年前
        1
  •  2
  •   Community CDub    7 年前

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

    至于C++异步IO库,请签出 this question .

    编辑: 我最初误解了你的意图(这个 Wikipedia article 把我填进去)。我不知道有多少 文件流 默认情况下是缓冲区,但可以使用 pubsetbuf(0, 0); 方法 described here ,然后进行自己的缓冲。但是,这可能比使用多个 文件流 带自动缓冲。一些基准测试已经就绪。

        2
  •  1
  •   Steve Jessop    14 年前

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

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

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

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