是否有任何编程技术,可移植的或特定于NTLinux的,能够更快地加载大量大文件的结果?我追求的是一个“提前”,一个“提前”,不管你怎么称呼它,我可以在代码中控制两个操作系统的机制。
必须对每个文件进行完整的处理,即完全按大小和顺序处理其内容。目的是加快批处理文件的速度。

最佳答案

我不知道类似于madvise()的win32(nt)api。
不过,我建议采取一种办法。
首先,将win32标志FILE_FLAG_SEQUENTIAL_SCAN传递给CreateFile()。这将允许windows操作系统在打开文件后对其执行更好的缓冲。
使用FILE_FLAG_SEQUENTIAL_SCAN,文件在内存中后,您的文件解析器可能会运行得更快。与Linux上的madvise()不同,由于使用了win32标志,该文件不会更早地开始加载到内存中。
接下来,我们需要触发文件以开始加载。通过使用ReadFileEx()结构和OVERLAPPED函数调用FileIOCompletionRoutine异步读取文件的第一页。
您的FileIOCompletionRoutine可以简单地返回,也可以在重叠结构中设置事件——阅读ReadFileEx的msdn详细信息以了解详细信息。
由于在实际读取文件时,如果预取没有完成,那么这将不是一个严重的故障,因此最简单的实现是“触发并忘记”--执行重叠的文件读取,然后从不检查其结果。不过,一定要将数据读入有效的缓冲区!
如果在读取上一个文件时对文件执行此操作,则结果应该是下一个文件将开始分页。
请注意,这可能会降低您的性能。当下一个文件开始分页时,访问该文件的磁盘I/O将与当前正在解析的文件的磁盘I/O竞争。如果两个文件在同一个磁盘上物理上彼此相距较远,则预取的结果可能是驱动器磁头寻找的额外延迟。尽管现代的驱动器有巨大的缓冲区来缓解这种情况,但是将新文件的第一页排队很可能会导致查找头部。
bdonlan建议的“预取”线程可以从处理中异步加载文件,这对于win32也是一个可行的解决方案。

关于windows - 自定义预取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1562581/

10-12 03:21