Buduję aplikację delphi, która wykonuje symulację naukową. Rośnie w złożoności & teraz składa się z wielu jednostek i form.Delphi: Jak znaleźć i naprawić błąd EOutOfMemory?
Zaczynam otrzymywać błędy EOutOFMemory przy każdym uruchomieniu. Wydaje się, że dzieje się to podczas lub zaraz po tym, jak używam Tablicy wariantów tymczasowo w ramach funkcji. Ryzykując zadając naprawdę głupie pytanie, czy "tablica wariantów" prosi o kłopoty? (Mógłbym konwertować wszystko na string, ale tablica wariantów w zasadzie oszczędza wiele rzeczy kłamliwych).
przestępstwa użycie tablica może być:
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);
w Menedżerze zadań - szczytowego zużycia pamięci jest 42MB, VM jest 31M i Dostaję ~ 90.000 stron usterek na metę. (na maszynie xp z 3 GB pamięci RAM)
Czy ktoś ma ogólne wskazówki dotyczące monitorowania użycia pamięci przez różne komponenty w mojej aplikacji? lub na śledzenie przyczyny tego błędu?
Niedawno przeszedłem od przechowywania głównych danych projektu jako CSV do korzystania z ADO DB, Jednocześnie zacząłem również używać typu danych Wariant, zamiast konwertować ciąg tekstowy i pojedynczy/podwójny cały czas.
Podążałem za różnymi wskazówkami dotyczącymi oszczędzania pamięci, które mogę znaleźć, gdzie, w praktyce, usunąłem Application.CreateForm (TProject, Project); wyciągi z .dpr i tworzenie ich dynamicznie. (z wyjątkiem przypadków, w których formularze są używane w większości przypadków). Generaly używam najmniejszą praktyczną typ danych (bajt, shortstring, etc) i zminimalizować wykorzystanie zmiennych & funkcji
wszelkie wskazówki bardzo mile widziane „publiczne”, Brian
Spodziewasz się błędów strony. Nie martw się o to. Tablica 'Variant' nie brzmi zbyt źle. W końcu macie w tablicy tylko 54 elementy. 42 MB jest banalne. Niemal nie można powiedzieć, co się dzieje, biorąc pod uwagę tę informację. –
Jak zdefiniowano 'ArrayOfVariant'? czy przechowujesz obiekty w tablicy, czy tylko proste typy? – RRUZ
ArrayOfVariant jest zdefiniowany w oddzielnej jednostce użyteczności publicznej (ponieważ nie można przekazać "Array Of ...." między funkcjami, tj. ArrayOfVariant = Array of Variant, zawiera tylko wartości podwójne i wartościowe. – SolarBrian