哪个使用更少的内存?将项目添加到Clojure atom中的长列表或项目中的地图?

时间:2015-01-21 11:27:28

标签: clojure

我正在研究一些更新Clojure原子中订购的项目的东西。我可以将项目存储为矢量或索引地图。这些物品可能有数百万个附属物,所以我想选择效率最高的结构。

我的直觉是,与数百万次迭代的向量相比,向地图添加新项目所占用的内存更少,但我希望获得明确的答案:

因此,使用矢量可能是:

["a" "b"  ... "y"] -> ["a" "b"  ... "y" "z"]

有了地图,它将是:

{0 "a"    1 "b"  ... 25 "y"} -> {0 "a"   1 "b"  ... 25 "y"   26 "z"}

那么使用更少的内存呢?

1 个答案:

答案 0 :(得分:2)

在Clojure中,向量和哈希映射都使用tries作为其基本实现技术。

Clojure的向量直接使用元素的索引作为键的值来遍历trie以便找到值。使用位分区是为了将索引分成多个位,这些位可以用作每个级别的密钥。

另一方面,

Clojure的哈希映射哈希提供的索引,以创建一个键来遍历trie以便找到值。位分区用于散列索引,而不是直接用于索引。

用于遍历矢量和散列映射的trie的实际键将是32位int。

我希望矢量和哈希映射之间的内存使用差异可以忽略不计。哈希映射应该使用稍多的内存以满足密钥冲突,因此必须具有散列桶的开销。

对矢量和哈希映射available here的实现细节进行了更深入的讨论。