我正在编写一个批处理脚本,它遍历目录中的每个文件,查找代码文件并以某种方式修改它们。完成该任务后,我尝试在大约6,000个文件的大目录上运行它。在脚本中大约40分钟崩溃,我从命令提示符中获得了大量的内存不足错误,在查看任务管理器时运行脚本显示我的程序在每次循环迭代时以大约1MB的速率占用内存。因此,我自然而然地认为我做错了一些事情,我删除了为解决问题而编写的所有代码。但后来我留下了一个空文件,除了for循环,问题仍然存在!
这就是我在一个相当大的目录上运行的内容,就像我说的那样:
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set directory=%CD%
for /R "%directory%" %%a in (*.c *.cpp *.h *.idl) do (
set currentDir=%%~dpa
pushd !currentDir!
popd
)
我实际上已经把它修剪成:
@echo off
for /R "%CD%" %%a in (*) do echo
问题仍然存在。
批量循环中是否存在内存泄漏,或者我只是做错了什么?
我正在运行Windows XP 32位Service Pack 2,尽管我已经测试并确认问题仍然存在于Service Pack 3中。
答案 0 :(得分:2)
这不是解决方法(或重写)的答案。我已经运行了你的脚本,我看到了一些内存消耗,其中一些在脚本完成之前没有发布,但是我没有得到任何接近1 MB的迭代。 (就像@aphoria一样,我可以在c的根目录上运行脚本:在XP SP3和Vista上没有问题。)
我建议您关闭脚本不需要的任何进程,并一次在一个子目录中运行脚本。
如果您无法以任何其他方式解决此问题,我建议您尝试在Powershell中编写脚本。
答案 1 :(得分:1)
问题在于CMD.EXE和COMMAND.COM为使用留出了特定数量的内存。通常,在使用批处理文件进行大量处理时,您希望增加脚本可以使用的内存工作量。
根据您运行的操作系统环境,您可以执行以下操作:
WINDOWS NT / 2000 / XP:你可以改变 COMMAND.COM环境内存用 / e开关,例如:
command.com /e:2048 /c BatchFile.BAT
将在shell中运行BatchFile.BAT 2048字节的环境记忆。
WINDOWS 95/98 / ME:你可以改变 分配的环境内存 特别是MS-DOS窗口或在 特定批处理文件的快捷方式。 打开“属性”对话框 (右键单击快捷方式或桌面 图标,然后单击属性)。 单击“内存”选项卡。使用初始 环境下拉框设置一个 足以容纳变量的大小, 说2048字节(如果你愿意,可以更多)。
为了安全起见,我也会增加你的磁盘使用量。
答案 2 :(得分:0)
似乎for /R
占用了内部文件列表的内存。如果从驱动器根目录运行,则会显示内存消耗,因为驱动器根目录基本上具有很多递归文件。
这显示出更多的消费量:
@echo off
call :OUT_OF_MEMORY ^^
exit /b
:OUT_OF_MEMORY
call set __DUMMY=%%1
使用后果自负,可能无法阻止。 :)
PS:在Windows 7上复制