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

时间:2010-10-28 04:10:47

标签: winapi windows-vista

我有一个转换文件的程序。它采用输入文件名和输出文件名,从一个读取并写入另一个,并进行一些修改。我有源,但它很大,我没有清楚的操作图。我可以说在读写模式(_O_RDWR)中使用_wsopen_s打开文件,并且在开放时间似乎没有任何有趣的业务。

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

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

该计划的作者说,他们没有看到这种行为,他们不知道为什么会这样。

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

  • 我可以查找源代码中的任何内容,某种偷偷摸摸的函数调用,可能触发此类行为吗?
  • 我可以告诉操作系统不要这样做吗?
  • 而且,更一般地说,到底是什么?

这在x64 Vista Home Premium SP2上发生。

1 个答案:

答案 0 :(得分:0)

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

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