Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-01-2010
blaiselaborde blaiselaborde is offline
Miembro
 
Registrado: Nov 2006
Ubicación: Reino Unido
Posts: 39
Poder: 0
blaiselaborde Va por buen camino
Out of memory

Tengo una aplicación en Delphi 7 encargada de procesar grandes cantidades de ficheros y al poco tiempo de comenzar me saca el mensaje de "Out of memory".

Me puse a verificar tanto la Memoria disponible en discos desde las Propiedades de cada uno, así como la Memoria RAM desde el Administrador de tareas de Windows mientras la aplicación avanzaba y, aún con suficiente espacio tanto en Disco como en RAM vuelve y saca el mensaje.

Alguien me puede dar una idéa de por dónde puede estar haciendo aguas esta memoria??

Gracias.
Responder Con Cita
  #2  
Antiguo 19-01-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: Jul 2004
Ubicación: Barcelona - España
Posts: 15.443
Poder: 10
Neftali [Germán.Estévez] Va camino a la famaNeftali [Germán.Estévez] Va camino a la fama
Hola blaiselaborde, bienvenido/a a los foros.

Para saber porqué puede estar pasando este error, tal vez deberías explicitar un poco más algunos detalles de tu programa.
¿Qué hace?
¿Qué proceso realizas en el momento del error?
¿Alguna BD? ¿BDE?
...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 19-01-2010
[coso] coso is offline
Miembro Premium
 
Registrado: May 2008
Ubicación: Girona
Posts: 1.677
Poder: 0
coso Va por buen camino
Hola,
es posible que la memoria que estes agotando sea la del stack. Eso ocurriria si estas llamando recursivamente una funcion, por ejemplo. A ver si te sirve de ayuda. Saludos.
Responder Con Cita
  #4  
Antiguo 19-01-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 27.761
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Como dice coso, puede ser la memoria del stack, pero como dice Neftalí, ¡¡¡ datos, queremos más datos !!!
Responder Con Cita
  #5  
Antiguo 20-01-2010
blaiselaborde blaiselaborde is offline
Miembro
 
Registrado: Nov 2006
Ubicación: Reino Unido
Posts: 39
Poder: 0
blaiselaborde Va por buen camino
Out of memory

Gracias por el interés que le han dado a mi consulta.

He estado revisando la aplicación y no he visto funciones ó procedimientos stacks que se queden pillados ni recursivos.

La aplicación básicamente toma ficheros y los sube a Buffers para modificarlos y descargarlos nuevamente en otros ficheros.

Para ello utiliza arrays dinámicos de Char ó LongInt.

No lee de Base de Datos absoultamente nada.

Cualquier otra aclaración, con gusto.
Responder Con Cita
  #6  
Antiguo 20-01-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: Jul 2004
Ubicación: Barcelona - España
Posts: 15.443
Poder: 10
Neftali [Germán.Estévez] Va camino a la famaNeftali [Germán.Estévez] Va camino a la fama
Cita:
Empezado por blaiselaborde Ver Mensaje
Para ello utiliza arrays dinámicos de Char ó LongInt.
¿El tamaño de los arrays puede ser causa de ese problema?

Revisa con especial cuidado los códigos donde liberas memoria.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 20-01-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 27.761
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por blaiselaborde Ver Mensaje
[..]
La aplicación básicamente toma ficheros y los sube a Buffers para modificarlos y descargarlos nuevamente en otros ficheros.

Para ello utiliza arrays dinámicos de Char ó LongInt.

[..]

huy... huy... qué peligro

Precisamente ahí, como dice Neftalí, es una gran fuente de posibles problemas: buffers, arrays dinámicos, etc.
Responder Con Cita
  #8  
Antiguo 25-01-2010
blaiselaborde blaiselaborde is offline
Miembro
 
Registrado: Nov 2006
Ubicación: Reino Unido
Posts: 39
Poder: 0
blaiselaborde Va por buen camino
Memoria del Stack

Tendría ó sabría alguno qué funciones me permitirían mirar y manipular la memoria del Stack? . . . he estado mirando las API "GlobalMemoryStatus" y lo que obtengo son los mismos valores de la memoria física del Administrador de Tareas, que como comenté anteriormente, tiene suficiente memoria disponible al momento de sacar el mensaje de "Out of Memory".
Responder Con Cita
  #9  
Antiguo 25-01-2010
[coso] coso is offline
Miembro Premium
 
Registrado: May 2008
Ubicación: Girona
Posts: 1.677
Poder: 0
coso Va por buen camino
Hola,

Cita:
huy... huy... qué peligro
yo ahora estoy de acuerdo con neftali y casimiro, viendo que usas punteros. ¿Seguro que asignas y liberas memoria correctamente? De todas maneras, me da la sensacion que trabajas estilo 'c', digamos (corrigeme si me equivoco), vamos, que no usas clases ni nada de nada para cargar el fichero y modificarlo. Estaria bien que nos pusieras algo del codigo de asignacion y de liberacion, si de caso, para poder comentar un poco mejor. Un saludo.
Responder Con Cita
  #10  
Antiguo 26-01-2010
blaiselaborde blaiselaborde is offline
Miembro
 
Registrado: Nov 2006
Ubicación: Reino Unido
Posts: 39
Poder: 0
blaiselaborde Va por buen camino
Código . . .

He tratado de simplificar el código con la parte dónde se maneja la memoria dinámica, a ver si alguno me dá una idéa del problema de la aplicación. Como esta hay otras varias.

Código:
function TfrmPaginar.ObtenerListado( { Params}): Boolean;
Const
  Desborde65 = 65535+1;
  Desborde130 = Desborde65*2;
  Desborde190 = Desborde65*3;

var
  ListaCabecera       : TStringList;
  BufferPagDes,
  BufferPagDes65,
  BufferPagDes130,
  BufferPagDes190   : array of LongInt;

begin
  Result           := True;
  listaCabecera := TStringList.Create;
  Try
    Try
      SetLength(BufferPagDes,     NumPaginas + 1);
      SetLength(BufferPagDes65,  NumPaginas + Desborde65  + 1);
      SetLength(BufferPagDes130, NumPaginas + Desborde130 + 1);
      SetLength(BufferPagDes190, NumPaginas + Desborde190 + 1);
    Except
      On E: EOutOfMemory do
        Begin
          ShowMessage('Falta de Memoria: ' + E.Message);
          Result := False; 
         end; // On
    end; // Try

// ***** Código ****

   BufferCab    := StrAlloc(TamanoCab);
   BufferCab    := listaCabecera.GetText;

// ***** Código ****

  Finally
    listaCabecera.Free;
    
    if conCabecera then 
      StrDispose(BufferCab);

    Finalize(BufferPagDes);
    Finalize(BufferPagDes65);
    Finalize(BufferPagDes130);
    Finalize(BufferPagDes190);
  end;
end;

Última edición por Casimiro Notevi fecha: 26-01-2010 a las 18:15:36. Razón: Poner etiquetas code
Responder Con Cita
  #11  
Antiguo 26-01-2010
[coso] coso is offline
Miembro Premium
 
Registrado: May 2008
Ubicación: Girona
Posts: 1.677
Poder: 0
coso Va por buen camino
Hola,
haces un array de longint y le asignas numpaginas como longitud, aparte del desborde? no tendria que ser numero de datos por pagina * numpaginas (algo asi)? Porque usas 3 arrays? fijate que si asignas NumPaginas + Desborde65 + 1 ya estas asignando mas de 65535, por lo que en el caso que se pueda asignar mas de 65535 puedes directamente usar un array para todo(en el caso que no se pueda asignar te saltaria un error de memoria, claro, quiza vaya por aqui...)...
Personalmente haria una clase y lo miraria todo con lupa (mirar los limites de asignacion, que ahora no se; si el finalize funciona correctamente, si se necesita el freeandnil, etc...)
De todas maneras, para encontrar el error ahora lo mejor seria ir con el step para saber en que linea te salta...
Un saludo y a ver si te sirve.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Out of Memory luxus OOP 5 01-10-2008 00:11:54
rx memory table julyus .NET 2 18-09-2008 21:27:08
error.. out of memory... CarlosHernandez Firebird e Interbase 12 07-03-2007 15:03:22
Juego Memory Xema OOP 1 16-09-2004 14:59:24
insificient memory fabriciof Conexión con bases de datos 1 26-04-2004 21:03:29


La franja horaria es GMT +2. Ahora son las 18:22:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi