Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪个使用更少的内存?在Clojure atom中将项目添加到长列表还是将项目添加到映射?_Clojure - Fatal编程技术网

哪个使用更少的内存?在Clojure atom中将项目添加到长列表还是将项目添加到映射?

哪个使用更少的内存?在Clojure atom中将项目添加到长列表还是将项目添加到映射?,clojure,Clojure,我正在做一些事情,更新Clojure atom中排序的许多项。我可以将项目存储为向量或索引映射。这些项可能有数百万个附件,因此我想选择内存效率最高的结构 我的直觉是,与经过数百万次迭代的向量相比,向地图添加新项目使用的内存更少,但我希望得到一个明确的答案: 因此,对于向量,它可以是: ["a" "b" ... "y"] -> ["a" "b" ... "y" "z"] 如果有一张地图,它将是: {0 "a" 1 "b" ... 25 "y"} -> {0 "a" 1

我正在做一些事情,更新Clojure atom中排序的许多项。我可以将项目存储为向量或索引映射。这些项可能有数百万个附件,因此我想选择内存效率最高的结构

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

因此,对于向量,它可以是:

["a" "b"  ... "y"] -> ["a" "b"  ... "y" "z"]
如果有一张地图,它将是:

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

那么,哪一个会占用更少的内存呢?

在Clojure中,向量和哈希映射都用作它们的基本实现技术

Clojure的向量直接使用元素的索引作为键的值来遍历trie以查找值。位分区用于将索引拆分为可在每个级别用作键的位块

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

用于遍历向量和哈希映射的trie的实际键将是32位int

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


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

你的问题提到了
列表
数据类型,严格来说,它使用的内存最少,但你提出的两个解决方案都没有使用它。我已经更新了这个问题,使它更清晰。我很好奇——为什么直觉上认为地图会更有效?此外,在GC运行并且atom的历史(开始时并不长)刷新之后,创建百万项集合和向空集合追加一百万次之间不一定有太大区别,因此提出这个问题的方式有点奇怪。啊,我不知道。那么原子的历史会在一段时间后刷新吗?我认为映射会更有效,因为我认为向量必须被完全遍历,并且可能在每次更改时被完全替换,而映射条目只能被查找