我正在构建一个进行科学模拟的德尔福应用程序。它越来越复杂,现在由许多单元和形式组成。
每次运行时,我都会开始收到 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 内存的 xp 机器上)
有没有人有任何关于监视我的应用程序中不同组件的内存使用情况的一般提示?或追踪此错误的原因?
最近我已经从将主要项目数据存储为 CSV 到使用 ADO DB,同时我也开始使用 Variant 数据类型,而不是一直在字符串和单/双之间转换。
我遵循了各种我能找到的内存节省技巧,在实用的地方我已经删除了 Application.CreateForm(TProject, Project); 来自 .dpr 的语句并动态创建它们。(除了大部分时间都在使用表格的地方)。一般来说,我使用最小的实用数据类型(字节、短字符串等)并尽量减少“公共”变量和函数的使用
非常欢迎任何提示,布赖恩