2011-06-13 76 views
8

我正在写一个批处理脚本,通过查找代码文件的目录中的每个文件并以某种方式修改它们。完成该任务后,我试图在一个包含大约6000个文件的大目录上运行它。大约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

什么是pushd命令后点POPD吧?这对我来说没有意义。你将不会做任何事情(只要在两个目录之间来回切换)。 – steenhulthin 2011-06-13 12:51:06

+0

我在模拟我的实际代码的功能。在完整的文件中,推动和弹出之间有很多东西。 – Maynza 2011-06-13 12:52:42

+0

好吧,我认为你应该添加......没有显示代码的地方。 – steenhulthin 2011-06-13 12:54:00

回答

2

这与其说是一个答案作为一种变通方法(或重写)。我已经运行了你的脚本,并且看到了一些内存消耗,其中一些内容在脚本完成之前不会被释放,但是我没有在每次迭代接近1MB时获得任何东西。 (就像@aphoria我可以在c:的根目录下运行脚本:在XP SP3和Vista上没有问题。)

我建议您关闭脚本的任何不必要的进程并在一个子目录上运行脚本时间。

如果你不能以任何其他方式解决这个问题,我建议你尝试在Powershell中编写脚本。

+1

这实际上就是我们正在做的。 – Maynza 2011-06-13 17:05:48

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个字节(或更多,如果你愿意的话)。

为了安全起见,我还会增加磁盘内存使用量。