Entwickler-Ecke

Algorithmen, Optimierung und Assembler - arbeitsspeicherbedarf durch setlength beeinflussbar?


paul_swatschina - Sa 05.04.08 00:03
Titel: arbeitsspeicherbedarf durch setlength beeinflussbar?
hallo leute,

ich programmiere an einem grossen programm mit relativ grossen daten mengen.
und oft stürtzt mir der rechner ab, weil ich den arbeitsspeicher überlaste.
ich verwende innerhalb einer procedure zahlreiche arrays:
zb: 1) array of extended;
oder 2) array of array of extended;

die dimensionen werden zur laufzeit festgesetzt.

innerhalb der procedure sind mehrere lokale variablen also vom 1. oder 2. typ.
jetzt würde mich interessieren, ob es etwas nützt wenn man innerhald der procedure, sobald eine bestimmte variable nicht mehr gebraucht wird, setlength(name,0,0); macht...
verringert das den arbeitsspeicherbedarf?
oder wird erst wieder alles freigegeben wenn die procedure fertig ist?

ich kanns leider nur schwer testen, weil ich noch mit 10 anderen problemen kämpfe, und nicht genau weiss worans liegt!

danke,
paul


busybyte - Sa 05.04.08 00:30

Ja bringt definitiv was, hab's getestet. image_test habe ich verwendet weil ich gerade was ähnliches probiert habe,Achtung ca.500MB Belastung

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var images : array of TImage;
procedure image_test;
begin
  setLength(images,100000000);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
image_test;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  setLength(images,0);
end;


Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt


paul_swatschina - Sa 05.04.08 00:34

danke für den test.
dann werde ich das ganze wieder mal unter qualen einbauen.

ich hatte nur manchmal den eindruck, dass mein rechner nach einem durchlauf der procedure sehr langsam ist. und es dauert immer ein paar minuten, bis er sich erholt und es wieder weitergeht...

aber danke, trotzdem.
paul


busybyte - Sa 05.04.08 00:38

gerne,setlength ist aber langsam und sollte nicht zu oft verwendet werden


paul_swatschina - Sa 05.04.08 00:54

kann ichs anders machen als mit setlength?
sind meine array-typen ungünstig?


busybyte - Sa 05.04.08 01:01

Array's sind schon gut, wenn sie nicht permanent mit

Quelltext
1:
Setlength(irgendwas,Length(irgendwas)+1);                    

vergrössert werden.
Evtl kann noch der Typ des Arrays im Bezug auf Variablengrösse optimiert werden .
Für den Speicherverbrauch wüsste ich um diese Uhrzeit und ich glaube auch generell keine Alternative


paul_swatschina - Sa 05.04.08 01:06

nagut! trotzdem besten dank, und gute nacht:)

ich leg mich jatzt auch nieder!


Kroko - Sa 05.04.08 08:39

dynamische Array kann man auch mit Finalize(FMyArray); freigeben, ob es nun schneller/langsamer ist, kA