加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何通过不断增长的TDictionary避免内存不足?

发布时间:2020-12-15 04:07:13 所属栏目:大数据 来源:网络整理
导读:TDictionary TKEY的,TValue使用内部数组,如果它已满,则加倍: newCap := Length(FItems) * 2;if newCap = 0 then newCap := 4;Rehash(newCap); 这适用于中等数量的项目,但如果达到上限,则非常不幸,因为即使几乎有一半的内存仍然可用,它也可能抛出EOutOfMemor
TDictionary< TKEY的,TValue>使用内部数组,如果它已满,则加倍:
newCap := Length(FItems) * 2;
if newCap = 0 then
  newCap := 4;
Rehash(newCap);

这适用于中等数量的项目,但如果达到上限,则非常不幸,因为即使几乎有一半的内存仍然可用,它也可能抛出EOutOfMemory异常.

有没有办法影响这种行为?其他集合类如何处理这种情况?

解决方法

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

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

如果你不能这样做(你不知道你在字典中会有多少项),你需要重新考虑是什么让你首先选择TDictionary并选择一个提供更好折衷的数据结构为您的特定算法.例如,您可以使用二叉搜索树,因为它们通过在现有节点中旋转信息来进行平衡,无需重新分配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读