2012-10-17 7 views
8

Ich verwende eine TObjectList (Delphi 2007), um viele Daten zu speichern - ich erwarte etwa 300.000 Elemente oder mehr. Wenn eine Liste erstellt wird, ist die Standardgröße jedoch so eingestellt, dass nur vier Elemente gespeichert werden, acht, wenn man versucht, ein fünftes Element hinzuzufügen, dann sechzehn, wenn man versucht, ein neuntes Element usw. hinzuzufügen. Die Zahlen sind vielleicht aus, aber ich denke, die Funktionsweise ist korrekt. Das Problem dabei ist, dass alle Elemente aus dem nicht zugewiesenen Teil des Speichers in den neuen Speicherblock kopiert werden müssen, in den die neue erweiterte Liste migriert. Ich möchte eine bestimmte Anfangsgröße festlegen und die Reservierung von Speicher freigeben (oder die Speicherreservierung rückgängig machen, da das Reservieren und Zuweisen nicht dasselbe ist), den nicht belegten Speicherplatz, den die Liste zugewiesen/reserviert hat. Dies ist wahrscheinlich nicht viel Code, aber ich denke, dass es eine dauerhafte, solide Bezugnahme auf dieses Problem in Form einer Frage und Antwort geben sollte.Verwenden einer großen TObjectList und Freigeben des nicht verwendeten Teils

Antwort

12

Setzen Sie die Capacity auf die höchste Anzahl von Elementen, die Sie erwarten, füllen Sie die Liste und setzen Sie dann Capacity auf das, was Sie tatsächlich verwendet haben (optional). Dies vermeidet all das Zuweisen/Verschieben/Zuweisen/Verschieben von Zeug.

MyList.Capacity := 300000; 
// Add 280000 items here 

// Optionally, reduce the capacity. It's not important to do so unless 
// you end up with a lot of unused items. 
MyList.Capacity := MyList.Count; 
+0

Das funktioniert gut, danke. – programstinator