Winapi Win32文件I/O耗尽系统内存

Winapi Win32文件I/O耗尽系统内存,winapi,windows-vista,Winapi,Windows Vista,我有一个转换文件的程序。它接受一个输入文件名和一个输出文件名,从一个文件名读取,然后写入另一个文件名,并进行一些修改。我有来源,但它很大,我不清楚它的运作情况。我可以看出,文件是在读写模式(RDWR)下使用wsopen打开的,在打开时似乎没有任何有趣的事情发生 出于某种原因,当我尝试将此程序与某个大型输入文件一起使用时,会发生以下情况。首先,物理内存使用量和文件系统缓存使用的内存量(由任务管理器报告)增加。似乎每读一个字节和写一个字节,内存使用就会增加2个字节。请注意,这是操作系统拥有的内存:实

我有一个转换文件的程序。它接受一个输入文件名和一个输出文件名,从一个文件名读取,然后写入另一个文件名,并进行一些修改。我有来源,但它很大,我不清楚它的运作情况。我可以看出,文件是在读写模式(RDWR)下使用wsopen打开的,在打开时似乎没有任何有趣的事情发生

出于某种原因,当我尝试将此程序与某个大型输入文件一起使用时,会发生以下情况。首先,物理内存使用量和文件系统缓存使用的内存量(由任务管理器报告)增加。似乎每读一个字节和写一个字节,内存使用就会增加2个字节。请注意,这是操作系统拥有的内存:实际可执行文件的提交大小和工作集大小保持不变

然后,当文件系统缓存大小接近总可用内存时,操作系统开始将正在运行的程序交换到页面文件中,最终系统变得无响应

该项目的作者说,他们没有见过这种行为,也不知道为什么会发生这种情况

在我正式提出这个bug并试图让他们修复它之前(这可能需要很长时间,我现在需要程序工作):

  • 我能在源代码中找到什么东西,某种偷偷摸摸的函数调用,可以触发这种行为吗
  • 我可以告诉操作系统不要这样做吗
  • 而且,更一般地说,这到底是怎么回事

这种情况发生在x64 Vista Home Premium SP2上。

如果程序使用的内存与输入文件成正比,则程序似乎试图一次将所有内容读取到内存缓冲区中


一种典型的改进方法是,将数据读入限制在200kb或更大的缓冲区,然后进行处理,将转换后的数据写入输出文件。这样,它就不会耗尽系统内存。

如果程序使用的内存与您的输入文件成正比,那么看起来程序试图一次将所有内容读入内存缓冲区


一种典型的改进方法是,将数据读入限制在200kb或更大的缓冲区,然后进行处理,将转换后的数据写入输出文件。这样,它不会耗尽系统内存。

系统文件缓存不会受到读取大小的影响。在有未使用的RAM之前,为什么不使用它呢?但奇怪的是,为什么缓存优先于正在运行的程序..程序本身不使用内存,操作系统使用!系统文件缓存不受读取大小的影响。在有未使用的RAM之前,为什么不使用它呢?但奇怪的是,为什么缓存优先于正在运行的程序..程序本身不使用内存,操作系统使用!W2k8存在已知的类似问题。你试过谷歌吗?确定它不漏把手吗?它不漏把手。谷歌没有帮助。我投票决定结束这场辩论,因为这不是一个编程问题,而是一个程序编写者的客户支持问题。如果该程序是打包软件,无法运行,他们应该修复它,或者退款。W2k8也存在已知的类似问题。你试过谷歌吗?确定它不漏把手吗?它不漏把手。谷歌没有帮助。我投票决定结束这场辩论,因为这不是一个编程问题,而是一个程序编写者的客户支持问题。如果该程序是打包软件,并且不起作用,他们应该修复它,或者退款。