2015-01-21 46 views
0

我正在處理某些事情,我更新了許多在Clojure原子中排序的項目。我可以將項目存儲爲矢量或作爲索引映射。這些項目可能有數百萬個附件,所以我想選擇最高效的內存結構。哪些內存使用較少?將項目添加到Clojure原子的長列表或項目到地圖?

我的直覺是,加入新的項目到地圖中使用相比,經過數百次迭代的矢量內存少,但想獲得一個明確的答案:它可以是載體

所以:

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

並配有地圖將是:

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

那麼這將使用較少的內存?

+1

你的問題提到'list'數據類型,嚴格來說它會使用最少的內存,但是你提出的解決方案都不會使用它。 – noisesmith 2015-01-21 15:48:24

+0

我已更新問題以使其更清晰 – Zubair 2015-01-21 16:00:04

+0

我很好奇 - 爲什麼直覺期望地圖會更高效?另外,在GC運行之後,原子的歷史(開始時並不是那麼長)已經滿了,創建一百萬個項目集合並附加到一個空集合一百萬次之間沒有太大差別,所以提出這個問題的方式有點奇怪。 – 2015-01-21 16:52:47

回答

2

在Clojure中,向量和散列圖都使用tries作爲他們的基本實現技術。

Clojure的向量直接使用元素的索引作爲密鑰的值,以便查找該值。使用位分區是爲了將索引拆分成可在每個級別用作密鑰的位塊。

另一方面,Clojure的哈希映射哈希提供的索引創建一個鍵來遍歷trie以便找到值。位分區用於哈希索引而不是直接在索引上。

用於遍歷向量和散列映射的實際關鍵字將是一個32位整數。

我期望矢量和散列圖之間的內存使用差異可以忽略不計。哈希映射應該使用更多的內存以迎合關鍵衝突,因此必須具有散列桶的開銷。

關於矢量和散列圖的實現細節available here有更深入的討論。