FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
Como dice coso, puede ser la memoria del stack, pero como dice Neftalí, ¡¡¡ datos, queremos más datos !!!
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#5
|
|||
|
|||
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. |
#6
|
||||
|
||||
¿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. |
#7
|
||||
|
||||
Cita:
huy... huy... qué peligro Precisamente ahí, como dice Neftalí, es una gran fuente de posibles problemas: buffers, arrays dinámicos, etc.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#8
|
|||
|
|||
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".
|
#9
|
|||
|
|||
Hola,
Cita:
|
#10
|
|||
|
|||
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 |
#11
|
|||
|
|||
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. |
|
|
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 |
|