Использование большого списка TObjectList и освобождение неиспользуемой части
Я использую TObjectList (Delphi 2007) для хранения МНОГО данных - я ожидаю иметь около 300 тысяч элементов или даже больше. Однако, когда список создается, его размер по умолчанию устанавливается для хранения только четырех элементов, затем восьми, если кто-то пытается добавить пятый элемент, и шестнадцати, если он пытается добавить девятый элемент, и так далее. Числа могут быть выключены, но я думаю, что работа правильна. Проблема в том, что все элементы должны быть скопированы из освобожденной части памяти в новый блок памяти, куда мигрирует новый расширенный список. Я хотел бы установить конкретный начальный размер и освободить (или отменить резервирование памяти, поскольку резервирование и выделение - это не одно и то же) любое неиспользуемое пространство, которое список выделил / зарезервировал. Это, вероятно, не много кода, но я думаю, что должна быть постоянная, твердая ссылка на эту проблему в форме вопроса и ответа.
1 ответ
Установить Capacity
на наибольшее количество ожидаемых элементов, заполните список, а затем установите Capacity
к тому, что вы на самом деле использовали (необязательно). Это позволяет избежать всего, что связано с выделением / перемещением / выделением / перемещением.
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;