Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

consumo excesivo de RAM

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: consumo excesivo de RAM Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
     }

{...}

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Foro
Todo resuelto Laughing
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 Wink
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.