代码之家  ›  专栏  ›  技术社区  ›  Eugene Smith

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

  •  2
  • Eugene Smith  · 技术社区  · 15 年前

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

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

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

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

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

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

    这发生在x64 Vista Home Premium SP2上。

    1 回复  |  直到 15 年前
        1
  •  0
  •   nonopolarity    15 年前

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

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

    推荐文章