科学的なシミュレーションを行うデルファイアプリケーションを構築しています。複雑さが増しており、現在は多くのユニットとフォームで構成されています。
実行するたびに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);
タスクマネージャーの場合-ピークメモリ使用量は42MB、VMは31Mで、実行ごとに最大90,000ページフォールトが発生します。(3GBのRAMを搭載したXPマシン上)
アプリケーション内のさまざまなコンポーネントによるメモリ使用量を監視するための一般的なヒントはありますか?またはこのエラーの原因を追跡しますか?
最近、メインプロジェクトデータをCSVとして保存することから、ADO DBを使用するようになりました。同時に、文字列とシングル/ダブルを常に変換するのではなく、Variantデータ型を使用するようになりました。
私は、実際にApplication.CreateForm(TProject、Project);を削除したような、さまざまなメモリ節約のヒントに従いました。.dprからのステートメントそしてそれらを動的に作成します。(とにかくフォームがほとんどの時間使用されている場合を除く)。一般的に、私は最小の実用的なデータ型(バイト、ショートストリングなど)を使用し、「パブリック」変数と関数の使用を最小限に抑えます
どんなヒントも大歓迎です、ブライアン