代码之家  ›  专栏  ›  技术社区  ›  rama-jka toti

自定义预取

  •  1
  • rama-jka toti  · 技术社区  · 15 年前

    NT Linux 那得到的结果是加载大文件的数量更快?我追求的是一个“提前”,一个“提前”,不管你怎么称呼它,我都可以在一个问题中用代码控制两个操作系统的机制。

    必须对每个文件进行完整处理,即完全按大小顺序处理其内容。其目的是加快某些批处理文件的处理速度。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Heath Hunnicutt    15 年前

    我不知道有类似的Win32(NT)API madvise() .

    不过,我建议采取一种办法。

    FILE_FLAG_SEQUENTIAL_SCAN CreateFile() . 这将允许Windows操作系统在打开文件后对其执行更好的缓冲。

    具有 madvise() 在Linux上,由于使用Win32标志,该文件不会更早开始加载到内存中。

    ReadFileEx() OVERLAPPED 结构和a FileIOCompletionRoutine

    FileIOCompletion例程 可以简单地返回,也可以在重叠结构中设置事件——阅读 ReadFileEx 详情请参阅。

    由于在实际读取文件时,如果预取尚未完成,则不会出现严重故障,因此最简单的实现是“触发并忘记”——执行重叠文件读取,然后从不检查读取结果。但是,请确保将数据读入有效的缓冲区!

    请注意,这可能会降低您的性能。当下一个文件开始分页时,访问该文件的磁盘I/O将与当前正在解析的文件的磁盘I/O竞争。如果两个文件在同一磁盘上物理距离较远,预取的结果可能会在驱动器头查找时产生额外延迟。虽然现代驱动器有巨大的缓冲区,可以缓解这种情况,但将新文件的第一页排队可能会导致头部搜索。

    bdonlan建议使用“预取”线程,从处理中异步加载文件,这对于Win32也是一个可行的解决方案。

        2
  •  4
  •   bdonlan    15 年前

    我不知道NT,但Linux上的一个选项是使用 madvise MADV_WILLNEED 在您实际需要下一个文件在早期开始读取它之前不久标记。

    或者,一个更具可移植性的选项是,只需在缓冲区处理线程之外的单独线程中手动执行readahead,也就是说,在线程a中读取数据以填充一个X MB缓冲区,在线程B中以尽可能快的速度处理它。