Sto costruendo un'applicazione delphi che esegue la simulazione scientifica. Sta crescendo in complessità & ora consiste di molte unità e forme.Delphi: come trovare e correggere un errore EOutOfMemory?
sto iniziando a ottenere gli errori EOutOFMemory ogni volta che corro. Sembra che accada durante o subito dopo che utilizzo una matrice di varianti temporaneamente all'interno di una funzione. A rischio di fare una domanda davvero stupida, la "matrice di varianti" richiede problemi? (Potrei convertire tutto in stringa, ma l'array di varianti in linea di principio consente di risparmiare un sacco di cose di disturbo).
l'incriminato uso array potrebbe essere:
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);
in Task Manager - l'utilizzo della memoria di picco è 42MB, VM è 31M e sto ricevendo ~ 90.000 errori di pagina al run. (su una macchina xp con RAM da 3 GB)
Qualcuno ha suggerimenti generali sul monitoraggio dell'utilizzo della memoria da parte dei diversi componenti all'interno della mia applicazione? o per rintracciare la causa di questo errore?
Recentemente sono passato dall'archiviazione dei dati del progetto principale come CSV all'utilizzo dei DB ADO, Allo stesso tempo, ho anche iniziato a utilizzare il tipo di dati Variant piuttosto che a convertire la stringa betweem e singola/doppia tutto il tempo.
Ho seguito vari suggerimenti per il risparmio di memoria che posso trovare, in cui pratico ho rimosso Application.CreateForm (TProject, Project); dichiarazioni dal .dpr e creandole dinamicamente. (eccetto dove i moduli vengono usati la maggior parte del tempo comunque). Generaly Io uso più piccolo tipo di dati pratico (byte, ShortString, ecc) e ridurre al minimo l'uso di variabili 'pubblici' & funzioni
qualche consiglio molto graditi, Brian
Si prevede di ottenere errori di pagina. Non preoccuparti di questo. Un 'array di Variant' non suona male. Dopo tutto hai solo 54 elementi nella matrice. 42 MB è banale. Quasi impossibile dire cosa sta succedendo dato questa informazione. –
Come viene definito 'ArrayOfVariant'? stai memorizzando oggetti nell'array o solo tipi semplici? – RRUZ
ArrayOfVariant è definito in un'unità di servizio separata (poiché non è possibile passare "Array Of ...." tra le funzioni, ad esempio ArrayOfVariant = Array of Variant; contiene solo valori Double e String. – SolarBrian