Delphi: Как найти и исправить ошибку EOutOfMemory?

Я создаю приложение 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 и их динамическое создание. (за исключением случаев, когда формы все равно используются большую часть времени). Как правило, я использую наименьший практичный тип данных (байт, короткая строка и т. д.) и минимизирую использование «общедоступных» переменных и функций

. Приветствуются любые советы, Брайан

6
задан Hamish_Fernsby 5 April 2012 в 15:58
поделиться