【问题标题】:HashTable data structure alternative, which uses less memoryHashTable 数据结构替代方案,它使用更少的内存
【发布时间】:2012-06-20 07:19:56
【问题描述】:

我有大量的对象。每个对象都有一个唯一的 GUID。我需要这个 GUID 的地图对象。我现在使用 System.Collections.Hashtable。问题是添加对象 hashset 会改变其大小并导致大对象堆的碎片。它也需要两倍于我拥有的对象的内存。我需要减少内存使用量。

我需要的数据结构特征:

  • 添加对象
  • 按 ID 移除对象
  • 按 ID 查找对象
  • 运行数据结构 (foreach) 中的所有对象

为此目的最好的数据结构是什么?我知道有红黑树和 AVL 树,但我不知道哪种树更好用。也许还有另一种适合通过唯一标识符或字符串映射的树数据结构?哪种数据结构运行得更快?

【问题讨论】:

标签: c# data-structures


【解决方案1】:

数据结构是静态的还是动态的?如果它是静态的,请考虑使用perfect hashing。您将获得哈希表的好处,而无需太多内存开销。

不要指望树来解决您的问题...它们还具有相当高的内存开销,并且查询和更新的速度往往较慢。

【讨论】:

  • 数据结构是动态的,应该可以增长
【解决方案2】:

哈希表中的 500,000 个条目实际上并不多。只需在创建时告诉哈希表它会很大:

var myDict = new Dictionary<key,val>(1000000);

这将创建一个可容纳近 1,000,000 个元素的字典。当您接近 1,000,000 时,它将调整大小。旧的非泛型 Hashtable 为您提供更多控制,允许您指定负载因子以控制重新分配。看here

【讨论】:

  • 500,000 是正常状态,但是我的项目中有一些情况,当 Hashtable 占用 40mb 时。所以我不问如何使用 Dictionary 及其好处。我知道这个数据结构。是的,也许它比 Hashtable 更好。但我想要的是尝试另一种方法。我不相信字典是唯一的解决方案。
  • 字典是一个哈希表。您是否在某些移动设备上运行它,所以 40MB 对您来说是个问题?
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
相关资源
最近更新 更多