Windows 从内存中逐出只读内存映射页?

Windows 从内存中逐出只读内存映射页?,windows,memory-management,io,Windows,Memory Management,Io,我有一些巨大的二进制文件,我目前正在使用Windows上的内存映射读取它们。一切正常,但当文件大小大于内存时,问题就会出现。例如,在一台24Gib内存机器上,我映射了一个64Gib的文件,然后我通过它进行了或多或少的流式读取(不是完全流式读取,但还行)。然而,这个过程最终在某个时候使用了所有内存 我只接触了文件中的每个字节一次,所以它应该足以保持4-5gib左右的最佳性能。有没有办法强制Windows(7)丢弃页面?FlushViewOfFile只丢弃脏页,但在我的用例中,我只读取文件。我已经设

我有一些巨大的二进制文件,我目前正在使用Windows上的内存映射读取它们。一切正常,但当文件大小大于内存时,问题就会出现。例如,在一台24Gib内存机器上,我映射了一个64Gib的文件,然后我通过它进行了或多或少的流式读取(不是完全流式读取,但还行)。然而,这个过程最终在某个时候使用了所有内存

我只接触了文件中的每个字节一次,所以它应该足以保持4-5gib左右的最佳性能。有没有办法强制Windows(7)丢弃页面?FlushViewOfFile只丢弃脏页,但在我的用例中,我只读取文件。我已经设置了NO_BUFFER标志,但我希望能够以某种方式降低页面优先级,以便它们更快地被逐出。现在,一旦内存满了,应用程序就会停止运行,因为Windows会把所有内容都翻出来


[编辑]它是64位windows上的64位应用程序。

不要将其全部映射为单个视图。调用
CreateFileMapping
一次,然后根据需要调用
MapViewOfFile
UnmapViewOfFile
UnmapViewOfFile
应导致页面被丢弃


当然,您可以同时拥有来自同一文件映射的多个视图,它们可以重叠,也可以不重叠,并且重叠视图将是一致的(即使在不同的文件映射和不同的过程中)。

不要将其全部映射为单个视图。调用
CreateFileMapping
一次,然后根据需要调用
MapViewOfFile
UnmapViewOfFile
UnmapViewOfFile
应导致页面被丢弃


当然,您可以同时拥有来自同一文件映射的多个视图,它们可以重叠或不重叠,并且重叠视图将是一致的(即使在不同的文件映射和不同的进程中)。

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

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

是的,如果您不想使用AWE,这就足够了。不幸的是,Windows下没有madvise。取消映射不一定会丢弃。内核可能会保留它们,以防其他人打开该文件。@b argulies:True,但如果没有对它的引用,则会显著降低页面优先级。我同意这一点。是的,如果您不想使用AWE,这就很好了。不幸的是,Windows下没有madvise。取消映射不一定会丢弃。内核可能会保留它们,以防其他人打开该文件。@b参数:是的,但如果没有对它的引用,则会显著降低页面优先级。我同意这一点。
FlushViewOfFile
将页面与磁盘同步,文档不建议放弃任何内容。
FlushViewOfFile
将页面与磁盘同步,文档不建议放弃任何内容。