从内存中驱逐只读内存映射页面?

时间:2011-03-26 17:02:11

标签: windows memory-management io

我有一些巨大的二进制文件,我目前正在使用Windows上的内存映射进行阅读。一切正常,但是当文件大小大于内存时问题就开始了。例如,在24 GiB内存机器上,我映射了一个64 GiB文件然后我正在通过它进行更多或更少的流读取(不是完全流式传输,但是很好。)尽管如此,这个过程最终会耗尽所有内存。某点。

我正在触摸文件中的每个字节一次,所以它应该足够让我们说4-5 GiB左右以获得最佳性能。有没有办法强制Windows(7)丢弃页面? FlushViewOfFile仅丢弃页面,但在我的用例中,我只是从文件中读取。我已经设置了NO_BUFFER标志,但我希望能够以某种方式降低页面优先级,以便更快地逐出。现在,一旦内存已满,应用程序将停止播放,因为Windows会将所有内容分页。

[编辑]这是64位Windows上的64位应用程序。

2 个答案:

答案 0 :(得分:3)

不要将它全部映射为单个视图。拨打CreateFileMapping一次,然后在需要文件片段时调用MapViewOfFileUnmapViewOfFileUnmapViewOfFile会导致页面被丢弃。

您当然可以同时从同一个文件映射中获得多个视图,它们可以重叠或不重叠,重叠视图将保持一致(即使在不同的文件映射和不同的进程中)。

答案 1 :(得分:2)

另一个选择是VirtualUnlock您知道暂时不会使用的页面。如果页面当前未被锁定,VirtualUnlock将从工作集中删除它们并将它们放在备用列表中,就像您取消映射它们一样。