2013-03-22 44 views
3

我有一個非常大的谷歌Multimap<String,String>,並正在尋找方法來減少內存使用量。在所有的例子我能找到的人都在做這樣的事情:Java Multimap <String,String>與Trove

Multimaps.newSetMultimap(
TDecorators.wrap(new TIntObjectHashMap<Collection<Integer>>()), 
new Supplier<Set<Integer>>() { 
public Set<Integer> get() { 
    return TDecorators.wrap(new TIntHashSet()); 
} 
}); 

該工程爲Multimap <Integer,Integer>,是有可能使用特羅韋包裝一個<String,String>

因爲任何人對未來感興趣,我會用 http://code.google.com/p/jdbm2/ 將散列圖寫入文件系統。

+0

什麼是* google Multimap *?你的意思是番石榴的'Multimap'? – 2013-03-22 20:18:12

+0

TIntObjectHashMap似乎需要int鍵,但它看起來沒有任何要求爲整數的值。你可以使用'Multimap '鍵入['String.hashCode()'](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html #hashCode()),而不是? – femtoRgon 2013-03-22 20:26:14

+0

你能告訴我們更多關於你的應用程序嗎?不可變集合,包括multimaps,比可變集合具有更高的內存效率。或者,根據你有的字符串的種類,它可能會例如將它們存儲在UTF-8'byte []'中更有效率。除了這兩個建議之外,除了磁盤上的數據庫之外,不可能有任何其他選項。 – 2013-03-22 20:36:02

回答

3

你可以看看哈希映射,像這樣的一個內存高效的變體:https://code.google.com/p/sparsehash/

如果你的價值字符串是足夠長的時間,壓縮可能是一種選擇。您還可以查看磁盤備份解決方案,例如Ehcache,具體取決於您的訪問統計信息。

+1

sparsehash項目是爲C++,而不是Java ... – 2013-03-22 20:40:08

0

我使用的方法是使用Map<String,Collection<String>>,其中的值始於ArrayList<String>,並在桶達到某個閾值(例如32個元素)時被提升爲HashSet<String>

我發現這爲小桶節省了大量的內存。

6

番石榴的Multimaps支持標準的JDK集合,這些集合不針對內存使用進行優化。例如,ArrayListMultimap<K, V>HashMap<K, ArrayList<V>>支持,HashMultimap<K, V>支持HashMap<K, HashSet<V>>

Eclipse Collections(原名稱爲GS Collections)具有由其自己的容器類型UnifiedMapUnifiedSet支持的Multimaps。 UnifiedMap使用內存的一半HashMapUnifiedSet使用內存的HashSet的四分之一。您將看到的內存優勢取決於您是使用FastListMultimap還是使用UnifiedSetMultimap

更詳細的存儲器比較可用here

注:我是Eclipse集合的提交者。

相關問題