Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Out of memory (https://www.clubdelphi.com/foros/showthread.php?t=65881)

blaiselaborde 19-01-2010 17:53:45

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.

Neftali [Germán.Estévez] 19-01-2010 18:16:10

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?
...

coso 19-01-2010 18:51:10

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.

Casimiro Notevi 19-01-2010 20:58:51

Como dice coso, puede ser la memoria del stack, pero como dice Neftalí, ¡¡¡ datos, queremos más datos !!! :)

blaiselaborde 20-01-2010 15:49:45

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.

Neftali [Germán.Estévez] 20-01-2010 16:35:16

Cita:

Empezado por blaiselaborde (Mensaje 351234)
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.

Casimiro Notevi 20-01-2010 20:17:38

Cita:

Empezado por blaiselaborde (Mensaje 351234)
[..]
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.

blaiselaborde 25-01-2010 17:31:12

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".

coso 25-01-2010 20:09:05

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.

blaiselaborde 26-01-2010 17:50:34

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;


coso 26-01-2010 19:52:27

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.


La franja horaria es GMT +2. Ahora son las 21:25:52.

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