elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Problema de memoria al ejecutar bat
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema de memoria al ejecutar bat  (Leído 2,764 veces)
cassiel83

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Problema de memoria al ejecutar bat
« en: 20 Marzo 2012, 14:59 pm »

Buenas tardes a todos, tengo un código en .bat que me crea una base de datos en formato xml.
El programa lee de un txt el listado (que consta de 10 campos separados por ";") de todos los archivos que deberían estar físicamente en el ordenador, va construyendo la base de datos con los archivos encontrados.
La base de datos que se genera al final consta de dos partes que uno al final.
El programa funciona al ejecutarlo la primera vez, pero cuando se ejecuta por segunda vez funciona por un momento y luego el ordenador muestra el mensaje de error: "windows no pudo guardar los datos en myarchivo, se perdieron los datos la posible causa de este error puede ser un error de hardware... intente guardar el archivo en otro sitio"
El ordenador se pone lento y las ventanas se muestran incompletas, se cuelga y tengo que desconectarlo para que se apague.
Creo que el problema podría ser que mi programa consume mucha memoria del sistema ya que si el listado txt es mas pequeño de alrededor de 1,000 lineas (y no como el primero de 30,000) el programa funciona bien, ademas si lo ejecuto con el listado grande, luego reinicio el ordenador y lo vuelvo a ejecutar, no da ningún fallo, también lo he ejecutado en otras maquina y siempre pasa lo mismo.
He estado viendo por allí un scrip para liberar memoria pero no me ha servido.
Por eso agradecería la ayuda de alguien que tenga experiencia con programas en .bat y de como gestiona la memoria, si al terminar un programa hay que liberar la memoria manualmente, aunque yo creo que eso debería gestionarlo el propio windows.

el código en cuestión es este:

Código
  1. ;echo off
  2. SETLOCAL  ENABLEDELAYEDEXPANSION
  3.  
  4. set /A conta=0
  5. set /A contb=0
  6.  
  7. echo a;^<?linea de cabecera?^>a; >> exi1_dat.txt
  8.  
  9. echo Reporte de creacion de BD > repo_bd.txt
  10. echo. >> repo_bd.txt
  11. echo Fecha y hora: %date% %time% >> repo_bd.txt
  12. echo. >> repo_bd.txt
  13.  
  14. for /F "tokens=1-10 delims=;" %%a in (dat.txt) do (
  15. if exist %%a (
  16.  
  17. set /A conta=!conta!+1
  18. set aut=%%b
  19. set tit=%%c
  20.  
  21. echo a; ^<primer dato="%%a"^>;a >> exi1_dat.txt
  22. echo a;  ^<cuarto a octavo dato=%%d %%e %%f %%g %%h /^>;a >> exi1_dat.txt
  23. echo a;  ^<decimo dato^> %%j ^<^>;a >> exi1_dat.txt
  24. echo a;  ^<noveno dato %%i /^>;a >> exi1_dat.txt
  25. echo a;  ^<otro dato primero=%%a /^>;a >> exi2_dat.txt
  26. ) else (
  27. echo %%a >> repo1_bd.txt
  28. set /A contb=!contb!+1
  29. )
  30. )
  31.  
  32. echo a; ^<linea final^>;a >> exi2_dat.txt
  33.  
  34. REM uniendo en uni.txt
  35.  
  36. for /F "tokens=1-3 delims=;" %%a in (exi1_dat.txt) do (
  37. REM echo %%b
  38. echo %%b>> uni.txt
  39. )
  40.  
  41. for /F "tokens=1-3 delims=;" %%a in (exi2_dat.txt) do (
  42. REM echo %%b
  43. echo %%b>> uni.txt
  44. )
  45.  
  46. ren uni.txt "Base de datos.xml"
  47.  
  48. del exi*.txt
  49.  
  50. echo. >> repo_bd.txt
  51. echo Numero de registros en BD:         !conta! >> repo_bd.txt
  52. echo. >> repo_bd.txt
  53. echo Numero de registros eliminados:    !contb! >> repo_bd.txt
  54. echo. >> repo_bd.txt
  55. echo registros eliminados: >> repo_bd.txt
  56.  
  57. copy repo_bd.txt + repo1_bd.txt reporte_bd.txt
  58.  
  59. echo.>> reporte_bd.txt
  60. echo Fin del reporte >> reporte_bd.txt
  61.  
  62. del repo_bd.txt
  63. del repo1_bd.txt
  64.  


Gracias de antemano.


« Última modificación: 20 Marzo 2012, 20:19 pm por EleKtro H@cker » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: Problema de memoria al ejecutar bat
« Respuesta #1 en: 20 Marzo 2012, 20:37 pm »

Usa las etiquetas cuando postees un código  :P



- Que yo sepa no hay forma de liberar memoria manualmente desde la CMD, Aunque he buscado un poco y supuestamente esto te debería servir:
Código
  1. rundll32.exe advapi32.dll,ProcessIdleTasks



- Para intentar agilizar la tarea del bat probemos por evitar la expansión y evitar el uso de otros comandos innecesarios:

(No puedo probar el bat debido a que no tengo el "dat.txt", Si he cometido alguna errata corrigelo tú mismo, Aqui tienes la idea)

Código
  1. @Echo OFF
  2.  
  3. echo a;^<?linea de cabecera?^>a;        >> "exi1_dat.txt"
  4. echo Reporte de creacion de BD   | MORE  > "repo_bd.txt"
  5. echo Fecha y hora: %date% %time% | MORE >> "repo_bd.txt"
  6.  
  7.  
  8. for /F "tokens=1-10 delims=;" %%a in (dat.txt) do (
  9.     if exist %%a (
  10. Call :ContA
  11. REM No estás manipulando esta variable ## set aut=%%b
  12. REM No estás manipulando esta variable ## set tit=%%c
  13. echo a; ^<primer dato="%%a"^>;a                           >> "exi1_dat.txt"
  14. echo a;  ^<cuarto a octavo dato=%%d %%e %%f %%g %%h /^>;a >> "exi1_dat.txt"
  15. echo a;  ^<decimo dato^> %%j ^<^>;a                       >> "exi1_dat.txt"
  16. echo a;  ^<noveno dato %%i /^>;a                          >> "exi1_dat.txt"
  17. echo a;  ^<otro dato primero=%%a /^>;a                    >> "exi2_dat.txt"
  18.     ) else (
  19. echo %%a >> "repo1_bd.txt"
  20. Call :ContB
  21.     )
  22. )
  23.  
  24. echo a; ^<linea final^>;a >> "exi2_dat.txt"
  25.  
  26. REM uniendo en uni.txt
  27.  
  28. for /F "tokens=1-3 delims=;" %%a in (exi1_dat.txt) do (
  29.   REM echo %%b
  30.   echo %%b>> "uni.txt"
  31.   )
  32.  
  33. for /F "tokens=1-3 delims=;" %%a in (exi2_dat.txt) do (
  34.   REM echo %%b
  35.   echo %%b>> "uni.txt"
  36.   )
  37.  
  38. ren "uni.txt" "Base de datos.xml"
  39.  
  40. del "exi*.txt"
  41.  
  42. echo.                                                   >> "repo_bd.txt"
  43. echo Numero de registros en BD:         %conta% | MORE  >> "repo_bd.txt"
  44. echo Numero de registros eliminados:    %contb% | MORE  >> "repo_bd.txt"
  45. echo registros eliminados:                              >> "repo_bd.txt"
  46.  
  47. copy "repo_bd.txt" + "repo1_bd.txt" "reporte_bd.txt"
  48.  
  49. echo.                >> "reporte_bd.txt"
  50. echo Fin del reporte >> "reporte_bd.txt"
  51.  
  52. del "repo_bd.txt"; "repo1_bd.txt"
  53.  
  54.  
  55. :ContA
  56. set /A conta+=1
  57. Goto :Eof
  58.  
  59. :ContB
  60. set /A contb+=1
  61. Goto :Eof


Salu2


« Última modificación: 20 Marzo 2012, 20:47 pm por EleKtro H@cker » En línea


cassiel83

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Problema de memoria al ejecutar bat
« Respuesta #2 en: 22 Marzo 2012, 15:54 pm »

Hola voy a probar el código aunque no entiendo para que sirve el "|MORE", ¿mostrar pantalla a pantalla?, bueno veré que tal me va gracias
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: Problema de memoria al ejecutar bat
« Respuesta #3 en: 22 Marzo 2012, 16:08 pm »

no entiendo para que sirve el "|MORE", ¿mostrar pantalla a pantalla?

En este caso lo he usado como replazamiento de tus "Echo." para agregar lineas en blanco.

Un saludo
En línea


cassiel83

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Problema de memoria al ejecutar bat
« Respuesta #4 en: 23 Marzo 2012, 17:33 pm »

Lo he probado pero sigue igual, leí que el código inicial que me diste sirve para forzar al windows a realizar tareas que solo haría cuando el ordenador esta ocioso y que no tiene nada que ver con liberar memoria. He intentado quitar el bucle que une los exi_dat en el archivo final y reemplazarlo por concatenar directamente y mejora un poco (puedo ejecutar el programa mas veces) pero aparece el problema del símbolo del cuadrado al unir dos txt.
Dado que trae tantos problemas y el MS DOS es tan limitado intentare hacerlo en C++ a partir de ahora.
Saludos y gracias.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines