2011-06-13 15 views
8

Estoy escribiendo un script por lotes que recorre todos los archivos de un directorio en busca de archivos de código y los modifica de alguna manera. Después de terminar esa tarea, traté de ejecutarlo en un gran directorio con aproximadamente 6.000 archivos. Alrededor de 40 minutos en el script se bloquearon y recibí muchos errores de memoria desde el símbolo del sistema, ejecutar el script mientras miraba el administrador de tareas mostró que mi programa estaba consumiendo memoria a una velocidad de 1 MB por iteración de bucle. Así que, naturalmente, pensando que había hecho algo mal recorté todo el código que había escrito para aislar el problema. Pero luego me quedé con un archivo vacío a excepción de un bucle for y ¡el problema aún persistía!¿Pérdida de memoria en lote para el bucle?

Esto es lo que me encontré en un directorio bastante grande como dije:

@echo off 
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
set directory=%CD% 
for /R "%directory%" %%a in (*.c *.cpp *.h *.idl) do (
    set currentDir=%%~dpa 
    pushd !currentDir! 
    popd 
) 

en realidad he sido capaz de recortar hacia abajo a:

@echo off 
for /R "%CD%" %%a in (*) do echo 

Y el problema aún persiste.

¿Hay una pérdida de memoria en el lote por bucle o simplemente estoy haciendo algo mal?

Estoy ejecutando Windows XP Service Pack 2 de 32 bits aunque he probado y confirmado el problema sigue presente en el Service Pack 3

+0

¿Cuál es el punto emergente justo después del comando pushd? Eso no tiene sentido para mí. No logrará nada de eso (yendo y viniendo entre 2 directorios). – steenhulthin

+0

Estoy emulando lo que hace mi código real. En el archivo completo hay muchas cosas entre el push y el pop. – Maynza

+0

bien, creo que deberías agregar ... donde no se muestra el código. – steenhulthin

Respuesta

2

Esto no es tanto una respuesta como una solución (o reescribir). He ejecutado su secuencia de comandos y veo un poco de consumo de memoria, algo que no se libera hasta que termina el script, pero no obtengo nada cerca de 1 MB por iteración. (Al igual que @aphoria, puedo ejecutar el script en la raíz de c: sin problemas en XP SP3 y Vista.)

Sugiero que cierre cualquier proceso que no sea necesario para el script y ejecute el script en un subdirectorio en un hora.

Si no puede resolver esto de otra manera, le sugiero que intente escribir el guión en Powershell.

+1

Esto es esencialmente lo que estamos haciendo. – Maynza

1

El problema radica en el hecho de que CMD.EXE y COMMAND.COM reservan una cantidad específica de memoria para el uso. En general, cuando se utilizan archivos por lotes para hacer un montón de procesamiento, se desea aumentar la carga de trabajo de memoria que puede usar el script.

dependiendo del entorno de sistema operativo que está ejecutando, puede hacer lo siguiente:

Windows NT/2000/XP: Puede modificar memoria Entorno COMMAND.COM con el modificador/E, por ejemplo :

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

se ejecutará BatchFile.BAT en una cáscara con 2048 bytes de memoria medio ambiente.


Windows 95/98/ME: Usted puede cambiar la memoria asignada ambiente en una ventana de MS-DOS en particular o en el acceso directo a un archivo por lotes específicos. Abra el cuadro de diálogo Propiedades (haga clic con el botón derecho en el icono de Acceso directo o Escritorio y haga clic en Propiedades). Haga clic en la ficha Memoria.Utilice el cuadro desplegable de entorno inicial para establecer un tamaño que sea suficiente para sus variables; digamos 2048 bytes (o más si lo desea).

Para estar seguro, aumentaría el uso de la memoria del disco también.