自定义预取

任何编程技术,可移植或特定于NTLinux ,可以使大文件的数量加载得更快? 我是在“提前”之前,无论你喜欢称之为机制,我可以在代码中控制两个操作系统的问题。

每个文件都必须完整处理,即完整的大小和顺序的内容。 目的是加快一些batch file的处理。

Solutions Collecting From Web of "自定义预取"

我不知道类似于madvise()的Win32(NT)API。

不过,我会提出一个方法。

首先,将Win32标志FILE_FLAG_SEQUENTIAL_SCAN传递给CreateFile() 。 这将允许Windows操作系统在打开文件后对文件执行更好的缓冲。

通过FILE_FLAG_SEQUENTIAL_SCAN ,一旦文件在内存中,文件解析器可以更快地运行。 与Linux上的madvise()不同,由于使用了Win32标志,该文件将不会开始加载到内存中。

接下来,我们需要触发文件开始加载。 通过使用OVERLAPPED结构和FileIOCompletionRoutine函数调用ReadFileEx()来异步读取文件的第一页。

您的FileIOCompletionRoutine可以简单地返回,或者您可以在重叠的结构中设置事件 – 请阅读ReadFileEx的MSDN详细信息。

既然从文件中读取预取没有完成就不是一个关键的失败,最简单的实现就是“重写和遗忘” – 执行重叠文件读取,然后不检查结果它。 不过,请确保您将数据读取到有效的缓冲区中!

如果您在读取前一个文件时对文件执行此操作,则结果应该是下一个文件将开始分页。

请注意,这可能会降低您的表现。 当下一个文件开始导入时,访问该文件的磁盘I / O将与当前正在解析的文件的磁盘I / O进行竞争。 如果这两个文件在同一个磁盘上彼此物理距离很远,则预取的结果可能会随着驱动器磁头的要求而延长。 虽然现代驱动器有缓冲这种缓冲的巨大缓冲区,排队新文件的第一页可能会导致头部寻找。

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

我不知道NT,但是Linux上的一个选择就是在实际需要下一个文件开始阅读之前, MADV_WILLNEEDMADV_WILLNEED标志。

或者,更简单的方法是简单地在缓冲区处理线程的单独线程中手动执行readahead – 即读取数据以填充线程A中的一个X MB缓冲区,并尽可能快地处理线程B 。