2013-05-13 56 views
0

我正在開發一個需要大量內存對象的應用程序。其中最大的結構是類型輕量級集合w/Set合同

Map<String,Set<OwnObject>> (with Set as HashSet) 

與OwnObject是代表數據庫中的記錄一個重量級的對象。該應用程序有效,但具有相當大的內存佔用量。閱讀thisJava Specialists來自2001年的通訊,我已經分析了我上面的大型結構的內存使用情況。 HashSet在後面使用了一個HashMap,這反過來又是一個相當重量級的對象,我想這是我大部分額外內存去的地方。

試圖優化結構的內存使用情況,我想周圍的多個版本:

Map<String,List<OwnObject>> (with List as ArrayList) 
Map<String,OwnObject[]> 

兩個工作,兩者都比使用Set <>版本更瘦。不過,我想保持Set合同(條目的唯一性)。

一種方式是實現邏輯自己。我可以擴展ArrayList並確保add()中的合約。

是否有構架實現該履行合同設置輕量級收藏?還是我錯過了我可以使用的Java集合中的某些東西,而沒有確保我自己的唯一性?

+1

如果'OwnObject'是重量級的,如果你在地圖上有很多人,那麼你就可以放心地忽略'HashMap'的開銷。 – 2013-05-13 10:24:17

+0

爲了更好的易用性,你可以使用[番石榴的HashMultiMap(http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap),但我懷疑這會減少內存佔用。 – assylias 2013-05-13 10:25:54

+0

@MarkoTopolnik可悲的是,事實並非如此。 HashSet <>版本和ArrayList <>版本之間的內存差異差不多是700MB(從1.3GB下降)。 – 0xCAFEBABE 2013-05-13 10:26:11

回答

0

予實現的解決方案如下:

Map<String,OwnObject[]> 

添加和刪除到陣列使用Arrays.binarySearch()和2片System.arraysCopy()秒完成,通過該分選和獨特性上發生旁邊。