| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mie 28 Oct, 2009 11:35 pm Asunto: consumo excesivo de RAM |
|
|
Hola Foro, tengo la tarea de copiar 400 000 lineas de un fichero de tipo log a una tabla de una base de datos de Access.
El fichero log lo cargo en un memo, y luego recorro el memo para agregar la información a la tabla.
Lo primero es que cuando cargo el log en el memo (demora 13 segundos), al abrir el administrador de tareas me mustra que estoy consumiendo de 67.000 a 88.000 kb de memoria ram. Ese valor se matiene constante, luego de haber cargado el fichero log en el memo.
Algo curioso, si minimizo el form el uso de la ram desciende a 2.000 kb
Lo segundo, luego de 15 minutos de ejecutar mi aplicación (recorrer lineas del memo , hace modificaciones y pasa a base de datos linea a linea) muestra un mensaje que dice que me he sobrepasado de la RAM que puedo consumir. Esta aumenta conciderablemente de 67 a 88 a 96 a 120 de una forma espantosa
Aun no he logrado pasar un log completo a la base de datos porque como ya les digo me colapsa la aplicacion diciendo que no puede brindarme mas ram
El hardware con el que cuento es una PC de 512 RAM y un micro de 2.4Ghz.
Amigos realmente estoy sorprendido y parado en mi aplicacion por causa de estas anomalias.
Podrian decirme por favor si tienen alguna sugerencia o solucion a mis problemas, muchas gracias de antemano y saludos _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 28 Oct, 2009 11:59 pm Asunto: |
|
|
Pues el error está en tratar de cargar todo en un memo. Lee el fichero linea a línea o en los fragmentos que requiera tu aplicación. Será mas eficiente, rápido y no consumirás tu RAM en un pesado Memo.
Saludos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 29 Oct, 2009 10:38 am Asunto: |
|
|
Tal cual cual lo explicas ¿cargas el fichero el el TMemo y luego vas copiando cada línea a una tabla Access? ¿Por qué no haces la carga en la tabla directamente? No sé como será exactamente para hacerlo en Access, pero podrías hacer algo así:
| Código: | FILE *File;
char cLinea[256] = "\0";
if ((File = fopen("<Fichero>", "rt")) != NULL)
{
Query->Close();
Query->SQL->Text = "INSERT INTO MiTabla (Log) VALUES (:Log)";
while (fgets(cLinea, sizeof(cLinea), File) != NULL)
{
Query->Close();
Query->ParamByName("Log")->AsString = cLinea;
Query->ExecSQL();
}
fclose(File);
} |
En la carga puedes "trocear" la cadena como te haga falta o lo que sea necesario y luego procesas los registros de la tabla. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 29 Oct, 2009 11:58 pm Asunto: |
|
|
Primero que todo muchas gracias por las respuestas ofrecidas.
Estuve probando con las sugerencias de Angel y realmente el consumo de la RAM disminuyó enormemente y la aplicación elevó su velocidad 8 veces. Sin embargo sigue mostrandose un mensaje de consumo excesivo de memoria y se bloquea la PC.
Después de seguir detenidamente el rendimiento de la PC mientras corría la aplicación me di cuenta que el archivo de paginación sube en exceso y es ahora el que provoca el bloqueo.
Recuerden que estoy procesando 400000 líneas de texto y enviándolas para otro fichero.
Ahora lo que me deja loco es que con tan solo recorrer el fichero sin pasar información para el otro ya por las 70000 líneas se bloquea la PC.
Por favor necesito de la ayuda del foro para resolver este problema.
Muchas gracias. _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 30 Oct, 2009 3:38 am Asunto: |
|
|
Muestrame parte del codigo que usas en el archivo que cargas, pero al parecer con un Application->ProcessMessages(); dentro del While que te presenta Angel puedes solucionarlo.
| Código: |
{...}
fgets(cLinea, sizeof(cLinea), File); // leer antes
while ( cLinea != NULL)
{
Query->Close();
Query->ParamByName("Log")->AsString = cLinea;
Query->ExecSQL();
Application->ProcessMessages(); // aqui puedes ponerlo
fgets(cLinea, sizeof(cLinea), File); // continuar leyendo
}
{...} |
_________________
 |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 30 Oct, 2009 4:23 pm Asunto: |
|
|
Hola Foro
Todo resuelto
El problema radicaba en un puntero que tenia dentro de una funcion que llamaba n veces y nunca lo destruia.
Muchas gracias por la ayuda  _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 30 Oct, 2009 4:57 pm Asunto: |
|
|
Me alegro que lo hayas resuelto. Otra cosa que se me ocurre: Si lógicamente el fichero log se va incrementando pero no se borra puedes ir buscando y añadiendo sólo los registros que no estén procesados aun. Es una manera de reducir tiempo de proceso. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|