Estoy construyendo una aplicación delphi que hace simulación científica. Está creciendo en complejidad & ahora consta de muchas unidades y formularios.Delphi: ¿Cómo encontrar y corregir un error de EOutOfMemory?
Empiezo a recibir errores de EOutOFMemory cada vez que ejecuto. Parece suceder durante o justo después de que utilizo una Matriz de variante temporalmente dentro de las funciones. A riesgo de hacer una pregunta realmente tonta, ¿hay "variedad de variantes" que piden problemas? (Podría convertir todo a cadena, pero la matriz de variante, en principio, ahorra muchas cosas falsas).
el infractor gama uso podría ser:
Function TProject.GetCurrentProjParamsAsArray(LProjectName, LProjectType : ShortString): ArrayOfVariant;
Var
ArrayIndex : Word;
begin
SetLength (Result,54);
ArrayIndex := 0;
Result [ArrayIndex] := LProjectName; Inc(ArrayIndex);
Result [ArrayIndex] := LProjectType; Inc(ArrayIndex); // this structure makes it easier to add extra fields in the DB than hard coding the array index!!
Result [ArrayIndex] := FileTool.DateTimeForFileNames ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteName ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. PostCode ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. MetFileNamePath ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteLat ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteLong ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteAlt ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneIndex ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneHours ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneMeridian ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. Albedo ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. ArrayTilt ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. ArrayAzimuth ; Inc(ArrayIndex);
En administrador de tareas - el uso de memoria máximo es de 42 MB, VM es 31M y yo estoy poniendo ~ 90.000 errores de páginas por serie. (en una máquina xp con 3 GB de ram)
¿Alguien tiene alguna sugerencia general sobre la supervisión del uso de la memoria por los diferentes componentes de mi aplicación? o al rastrear la causa de este error?
Recientemente he pasado de almacenar los datos principales del proyecto como CSV a utilizar ADO DBs, Al mismo tiempo, también he comenzado a usar el tipo de datos Variant en lugar de convertir betweem string y single/double todo el tiempo.
he seguido varios consejos para el ahorro de memoria que puedo encontrar, en la práctica eliminé Application.CreateForm (TProject, Project); declaraciones del .dpr y crearlas dinámicamente. (excepto donde los formularios se usan la mayor parte del tiempo de todos modos). Generaly utilizo más pequeño tipo de datos prácticos (byte, ShortString, etc) y reducir al mínimo el uso de variables 'públicas' & funciones
algún consejo muy bienvenida, Brian
Espera obtener errores de página. No te preocupes por eso Un 'array of Variant' no suena tan mal. Después de todo, solo tienes 54 elementos en la matriz. 42 MB es trivial. Casi imposible decir qué está pasando con esta información. –
¿Cómo se define 'ArrayOfVariant'? ¿Estás almacenando objetos en la matriz o solo tipos simples? – RRUZ
ArrayOfVariant se define en una unidad de utilidad separada (ya que no puede pasar 'Array Of ....' entre funciones, es decir, ArrayOfVariant = Array of Variant; Contiene solo valores dobles y de cadena. – SolarBrian