2011-06-13 79 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個字節(或更多,如果你願意的話)。

爲了安全起見,我還會增加磁盤內存使用量。