哪个占用内存少?将项目添加到 Clojure atom 中的长列表或将项目添加到地图?
Which uses less memory? Adding item to long list in Clojure atom or an item to a map?
我正在做一些事情,更新许多在 Clojure 原子中排序的项目。我可以将项目存储为矢量或索引图。项目可能有数百万个附属物,所以我想选择内存效率最高的结构。
我的直觉是,与经过数百万次迭代的向量相比,向地图添加新项目使用的内存更少,但我想得到一个明确的答案:
所以对于向量它可以是:
["a" "b" ... "y"] -> ["a" "b" ... "y" "z"]
如果有地图,它将是:
{0 "a" 1 "b" ... 25 "y"} -> {0 "a" 1 "b" ... 25 "y" 26 "z"}
那么哪个会占用更少的内存?
在 Clojure 中,向量和哈希映射都使用 tries 作为它们的基本实现技术。
Clojure 的向量直接使用元素的索引作为键的值来遍历 trie 以找到值。使用位分区是为了将索引分成可用作每个级别的键的位块。
Clojure 的哈希映射,另一方面,散列 提供的索引以创建一个键来遍历 trie 以找到值。位分区用于散列索引而不是直接用于索引。
用于遍历向量和哈希映射的 trie 的实际键将是 32 位 int。
我希望向量和哈希映射之间的内存使用差异可以忽略不计。哈希映射应该使用稍微多一点的内存来应对键冲突,因此必须有哈希桶的开销。
对向量和哈希映射的实现细节都有更深入的讨论available here。
我正在做一些事情,更新许多在 Clojure 原子中排序的项目。我可以将项目存储为矢量或索引图。项目可能有数百万个附属物,所以我想选择内存效率最高的结构。
我的直觉是,与经过数百万次迭代的向量相比,向地图添加新项目使用的内存更少,但我想得到一个明确的答案:
所以对于向量它可以是:
["a" "b" ... "y"] -> ["a" "b" ... "y" "z"]
如果有地图,它将是:
{0 "a" 1 "b" ... 25 "y"} -> {0 "a" 1 "b" ... 25 "y" 26 "z"}
那么哪个会占用更少的内存?
在 Clojure 中,向量和哈希映射都使用 tries 作为它们的基本实现技术。
Clojure 的向量直接使用元素的索引作为键的值来遍历 trie 以找到值。使用位分区是为了将索引分成可用作每个级别的键的位块。
Clojure 的哈希映射,另一方面,散列 提供的索引以创建一个键来遍历 trie 以找到值。位分区用于散列索引而不是直接用于索引。
用于遍历向量和哈希映射的 trie 的实际键将是 32 位 int。
我希望向量和哈希映射之间的内存使用差异可以忽略不计。哈希映射应该使用稍微多一点的内存来应对键冲突,因此必须有哈希桶的开销。
对向量和哈希映射的实现细节都有更深入的讨论available here。