Использование большого списка 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;
Другие вопросы по тегам