我正在构建一个Delphi应用程序,用于进行科学模拟。它正在变得越来越复杂,现在包含许多单元和窗体。
每次运行时,我开始出现EOutOFMemory错误。似乎是在函数内部临时使用Variant数组期间或之后发生的。冒昧问一个非常愚蠢的问题,"Variant数组"是否会引起麻烦?(我可以将所有内容转换为字符串,但原则上"Variant数组"可以节省很多麻烦)。
可能存在问题的数组使用如下:
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,虚拟内存为31M,每次运行时我得到约90,000个页面错误。(在一台带有3GB RAM的XP机器上)
是否有人有关于监控应用程序中不同组件的内存使用情况的通用提示?或者对追踪此错误原因有什么建议?
最近,我已经从将主项目数据存储为CSV格式更改为使用ADO DB,同时我也开始使用Variant数据类型而不是一直在字符串和单/双精度之间进行转换。
我已经遵循了各种可以找到的节省内存的提示,例如,在实际可行的情况下,我已经从.dpr中删除了Application.CreateForm(TProject, Project)语句并动态创建它们(除了表单一直在使用的情况下)。通常我使用最小的实用数据类型(byte、shortstring等)并尽量减少使用'public'变量和函数。
任何提示都非常欢迎,Brian
ArrayOfVariant
是如何定义的?你是在数组中存储对象还是仅存储简单类型? - RRUZ