我正在进行一些工作,在其中我更新了许多项,这些项都是在Clojure原子中订购的。我既可以将项目存储为向量,也可以存储为索引地图。这些项目可能有数以百万计的附属物,所以我想选择最有效的内存结构。
我的直觉是,在地图中添加一个新项目比一个向量在数百万次迭代中使用的内存要少,但我想得到一个明确的答案:
因此,如果有一个向量,它可能是:
["a" "b" ... "y"] -> ["a" "b" ... "y" "z"]如果有了地图,就会是:
{0 "a" 1 "b" ... 25 "y"} -> {0 "a" 1 "b" ... 25 "y" 26 "z"}那么哪一个会使用更少的内存?
发布于 2015-01-21 16:12:14
在Clojure中,向量和散列映射都使用试一试作为它们的基本实现技术。
Clojure的向量直接使用元素的索引作为键的值来遍历trie,以便找到值。比特分区是为了将索引分割成块比特,这些比特可以作为每个级别上的键。
另一方面,Clojure的散列映射对提供的索引进行散列,以创建一个键来遍历trie,以便找到值。位分区用于散列索引,而不是直接用于索引。
用于遍历向量和散列映射的trie的实际键是32位int。
我认为向量和散列映射之间在内存使用上的差异是可以忽略不计的。哈希映射应该使用稍微多一点的内存,以满足关键冲突,因此必须有哈希桶的开销。
对于向量和散列映射可在这里找到的实现细节,还有更深入的讨论。
https://stackoverflow.com/questions/28066104
复制相似问题