Ik loop tegen een probleem aan mbt. geheugen. De situatie:
Ik heb een NAW object, deze bevet een ID en de NAW gegevens. Grofweg gezegd ziet die er zo uit, ik heb hier de class niet geheel afgemaakt, het gaat om het idee:
Omwille van database-performace, lees ik het geheel als volgt in (versimpeld weergegeven):
Bovenstaande code werkt perfect voor 10 NAW records, zonder memory leaks oid. Wil ik dit echter uitvoeren voor de 4400 NAW records waar ik dit voor nodig heb, dan krijg ik tijdens het inlezen van de NAW gegevens zo ongeveer halverwege de foutmelding 'OUT OF MEMORY'.
Op dat moment gebruikt mijn applicatie ca. 20Mb geheugen, iets wat acceptabel is. Mijn PC heeft dan nog zo'n 300Mb (!) fysiek geheigen vrij, dus ook geen probleem. Ik heb al de stack en heap vergroot, echter dit heeft totaal geen effect.
Wat kan ik hier nog aan doen? Het probleem is (dus) niet dat hij niet die 4400 objecten aan kan, hij kan ze alleen niet gevuld aan.
//edit
Inmiddels heb ik wel een workaround gevonden voor dit probleem: ik maakte overal gebruik van gewone strings, terwijl ik nooit strings langer heb dan 255. Vervanging van de strings door shortstrings heeft het probleem opgelost, en het geheugengebruik van de applicatie gehalveerd. Toch blijft mijn vraag staan; wat kan ik (anders) doen om dit probleem op te lossen?
Ik heb een NAW object, deze bevet een ID en de NAW gegevens. Grofweg gezegd ziet die er zo uit, ik heb hier de class niet geheel afgemaakt, het gaat om het idee:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| type ThzNAW = class (TObject) private public property ID: Integer; property Achternaam: String; property Voornaam: String; [..] meer velden, intotaal ong 15 [..] function Read: Boolean; constructor create(ID: Integer); end; [..] function ThzNAW.Read: Boolean begin // lees velden uit database op basis van ID nummer end; constructor ThzNAW.Create(ID: Integer); begin inherited; FID:=ID; end |
Omwille van database-performace, lees ik het geheel als volgt in (versimpeld weergegeven):
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| oNawLijst: TStringlist.Create; try // ophalen selectie ID-nummers With qryHaalNAWlijst do begin Open; Repeat nNAW_ID:=FieldByName('ID').AsInteger; oNawLijst.AddObject(IntToStr(nNaw_ID),ThzNAW.Create(nNaw_ID)); next; Until EOF; Close; end; // inlezen NAW gegevens For nLus:=0 to oNawLijst.Count-1 do ThzNAW(oNawLijst.Objects[nLus]).Read; [..] doe mijn shit met die lijst [..] finally for nLus:=0 to oNawLijst.Count-1 do ThzNAWM(oNawLijst.Objects[nLus]).Free; oNawLijst.Free; end; |
Bovenstaande code werkt perfect voor 10 NAW records, zonder memory leaks oid. Wil ik dit echter uitvoeren voor de 4400 NAW records waar ik dit voor nodig heb, dan krijg ik tijdens het inlezen van de NAW gegevens zo ongeveer halverwege de foutmelding 'OUT OF MEMORY'.
Op dat moment gebruikt mijn applicatie ca. 20Mb geheugen, iets wat acceptabel is. Mijn PC heeft dan nog zo'n 300Mb (!) fysiek geheigen vrij, dus ook geen probleem. Ik heb al de stack en heap vergroot, echter dit heeft totaal geen effect.
Wat kan ik hier nog aan doen? Het probleem is (dus) niet dat hij niet die 4400 objecten aan kan, hij kan ze alleen niet gevuld aan.
//edit
Inmiddels heb ik wel een workaround gevonden voor dit probleem: ik maakte overal gebruik van gewone strings, terwijl ik nooit strings langer heb dan 255. Vervanging van de strings door shortstrings heeft het probleem opgelost, en het geheugengebruik van de applicatie gehalveerd. Toch blijft mijn vraag staan; wat kan ik (anders) doen om dit probleem op te lossen?
[ Voor 15% gewijzigd door Verwijderd op 09-05-2003 16:58 ]