Я создаю приложение Delphi для научного моделирования. Он усложняется и теперь состоит из множества единиц и форм.
Я начинаю получать ошибки EOutOFMemory при каждом запуске. Кажется, это происходит во время или сразу после того, как я временно использую массив вариантов в функциях. Рискуя задать действительно глупый вопрос, вызывает ли «массив вариантов» проблемы? (Я мог бы преобразовать все в строку, но массив вариантов в принципе избавляет от многих подтасовок).
Использование массива, вызывающего нарушение, может быть следующим:
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);
В диспетчере задач пиковое использование памяти составляет 42 МБ, виртуальная машина — 31 МБ, и я получаю около 90 000 ошибок страниц за один запуск. (на машине xp с оперативной памятью 3 ГБ)
Есть ли у кого-нибудь общие советы по мониторингу использования памяти различными компонентами в моем приложении? или на отслеживание причины этой ошибки?
Недавно я перешел от хранения основных данных проекта в формате CSV к использованию баз данных ADO. В то же время я также начал использовать тип данных Variant вместо постоянного преобразования между строкой и одинарным/двойным числом.
я следовал различным советам по экономии памяти, которые я мог найти, например, там, где это было целесообразно, я удалил Application.CreateForm(TPoject, Project); операторы из .dpr и их динамическое создание. (за исключением случаев, когда формы все равно используются большую часть времени). Как правило, я использую наименьший практичный тип данных (байт, короткая строка и т. д.) и минимизирую использование «общедоступных» переменных и функций
. Приветствуются любые советы, Брайан