gpt4 book ai didi

delphi - 随着 TDictionary 的不断增长,如何避免内存不足?

转载 作者:行者123 更新时间:2023-12-03 14:47:40 26 4
gpt4 key购买 nike

TDictionary<TKey,TValue>使用内部数组,如果已满则加倍:

newCap := Length(FItems) * 2;
if newCap = 0 then
newCap := 4;
Rehash(newCap);

这对于中等数量的项目表现良好,但如果达到上限,那就非常不幸了,因为它可能会抛出 EOutOfMemory即使还有几乎一半的内存仍然可用,也会出现异常。

有什么方法可以影响这种行为吗?其他集合类如何处理这种情况?

最佳答案

您需要了解字典的工作原理。字典包含一个“哈希桶”列表,其中放置您插入的项目。这是一个有限的数字,所以一旦你填满它,你就需要分配更多的桶,这是没有办法解决的。由于对象到存储桶的分配是基于哈希函数的结果,因此您不能简单地将存储桶添加到数组的末尾并将内容放入其中,您需要重新分配整个 block 列表,重新散列所有内容并将其放入(新的)相应的存储桶中。

鉴于这种行为,使字典在满后不重新分配的唯一方法是确保它永远不会满。如果您知道要在字典中插入的项目数,请将其作为参数传递给构造函数,这样就完成了,不再需要重新分配字典。

如果您无法做到这一点(您不知道字典中的项目数量),您需要重新考虑是什么让您在第一个中选择了 TDictionary放置并选择一个数据结构,为您的特定算法提供更好的折衷方案。例如,您可以使用二叉搜索树,因为它们通过轮换现有节点中的信息来实现平衡,永远不需要重新分配。

关于delphi - 随着 TDictionary 的不断增长,如何避免内存不足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8355927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com