使用大型TObjectList并释放未使用的部分

8
我正在使用TObjectList(Delphi 2007)存储大量数据 - 我预计将有约30万个或更多元素。然而,当列表创建时,默认大小设置为仅存储四个元素,然后如果尝试添加第五个元素,则设置为八个,如果尝试添加第九个元素,则设置为十六个,以此类推。这些数字可能不准确,但我认为工作原理是正确的。问题在于所有元素都必须从内存的释放部分复制到新内存块,新扩展列表迁移的地方。我希望设置特定的初始大小,并撤消列表已分配/保留的任何未使用空间的分配(或取消内存预留,因为预留和分配不同)。 这可能不是很多代码,但我认为应该有一个永久的、可靠的参考来解决这个问题,形式是一个问题和答案。
1个回答

12

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接