Утечка памяти в пакете для цикла? - PullRequest
8 голосов
/ 13 июня 2011

Я пишу пакетный скрипт, который просматривает каждый файл в каталоге, ищет файлы кода и каким-то образом модифицирует их.После того, как я выполнил эту задачу, я попытался запустить ее в большом каталоге, содержащем около 6000 файлов.Около 40 минут в сценарии произошел сбой, и я получил много ошибок нехватки памяти из командной строки. Запуск сценария, глядя на диспетчер задач, показал, что моя программа потребляет память со скоростью примерно 1 МБ на одну итерацию цикла.Естественно думая, что я сделал что-то не так, я вырезал весь код, который я написал, чтобы изолировать проблему.Но затем я остался с пустым файлом, за исключением цикла 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

Ипроблема не устраненапроблема все еще присутствует в пакете обновления 3.

Ответы [ 3 ]

2 голосов
/ 13 июня 2011

Это не столько ответ, сколько обходной путь (или переписать). Я запустил ваш сценарий и вижу некоторое потребление памяти, часть которого не освобождается до завершения сценария, но я не получаю ничего около 1 МБ за итерацию. (Так же, как @aphoria, я могу запустить скрипт в корне c: без проблем на XP SP3 и Vista.)

Я предлагаю вам закрыть любой процесс, не необходимый для скрипта, и запускать ваш скрипт в одном подкаталоге за раз.

Если вы не можете решить эту проблему каким-либо иным способом, я предлагаю вам попробовать написать скрипт на Powershell.

1 голос
/ 13 июня 2011

Проблема заключается в том, что CMD.EXE и COMMAND.COM выделяют определенный объем памяти для использования.Как правило, при использовании пакетных файлов для выполнения большой обработки требуется увеличить нагрузку на память, которую может использовать сценарий.

В зависимости от среды ОС, которую вы используете, вы можете сделать следующее:

WINDOWS NT / 2000 / XP: Вы можете изменить память среды COMMAND.COM с помощью ключа / e, например:

command.com /e:2048 /c BatchFile.BAT

запустит BatchFile.BAT в оболочке со средой 2048 байтпамять.


WINDOWS 95/98 / ME: Вы можете изменить память среды, выделенную в конкретном окне MS-DOS или в ярлыке, на определенный пакетный файл.Откройте диалоговое окно «Свойства» (щелкните правой кнопкой мыши значок ярлыка или на рабочем столе и выберите «Свойства»).Нажмите вкладку памяти.Используйте раскрывающийся список начальной среды, чтобы установить размер, достаточный для ваших переменных, скажем, 2048 байт (или больше, если хотите).

На всякий случай я бы увеличил использование дисковой памятиа также.

0 голосов
/ 15 августа 2018

Кажется for /R потребляет память для внутреннего списка файлов.Если запустить его из корня диска, он покажет потребление памяти, потому что корень диска в основном содержит довольно много файлов рекурсивно.

Этот показывает гораздо большее потребление:

@echo off

call :OUT_OF_MEMORY ^^
exit /b

:OUT_OF_MEMORY
call set __DUMMY=%%1

Используйте самостоятельнориск, это может быть неостанавливаемым.:)

PS: Воспроизводится в Windows 7

...