2013-04-26 43 views
4

的大量好了,解釋這個問題,問題...哪些數據結構,用來存儲字符串

我:
充滿了數以百萬計的條目(一張大數據庫表中的每個條目可具有「 n「列數量)。

的概念:(前「可用」和「選擇」)

我想展現給一個網絡接口兩個列表。 當用戶將條目從一個列表移動到另一個列表時,我需要將條目的unique-id(字符串類型)臨時存儲到我的服務器中名爲「selected」的「未知數據結構」中,並且當用戶最終點擊提交我會將這個列表進一步傳遞給其他應用程序。

對數據庫進行排序和篩選,然後將全部數據量(以塊爲單位)加載回java,然後檢查每個條目是否被選中並將添加到將要去的列表中顯示在Web界面中。

for each entry{ 
    if(selected.contains(currentEntry.ID)){ 
    selectedList.add(currentEntry) 
    }else{ 
    availableList.add(currentEntry) 
    } 
} 

名單selectedList和availableList將只持有幾百項(那些顯示給用戶,以最大100-200條目約頁)這樣一類的列表「項」是不夠好,持有我的排序。

問題:
結構「selected」必須包含數以千計的ID(有時可能達到百萬)。

需要:
我需要快速訪問來查找id是否存在(structure.contains(id)),所以我肯定會使用散列結構。 我需要使用最小內存資源的結構。

非需要:
不需要良好的刪除性能。排序是不需要的。

+1

設置將是我認爲最好的。 – 2013-04-26 12:23:06

+1

如果它必須保存這麼多的條目,你應該將它轉儲到數據庫表中,並附加一個額外的ID(例如某種類型的會話標識) – 2013-04-26 15:20:22

+0

經過大量測試後,我意識到所有的Hash結構(HashSet, LinkedHashMap等)執行大致相同。 TreeSet是我測試的性能較差的結構,需要最多的時間來查找和元素。 當我超過200.000個元素(當然,這與硬件等有關)時,我開始面臨溢出到我的測試系統的問題。 我可能會去解決方案使用數據庫表來保存選定的ID和直接從數據庫使用連接獲取數據(無論哪種方式我會使用數據庫進行排序和過濾) 感謝您的幫助。 – Stef 2013-05-03 12:22:12

回答

1

經過大量測試後,我意識到所有的哈希結構(HashSet,LinkedHashMap等)的性能大致相同。

當我超過200,000個元素(當然,這與硬件等有關)時,我開始面臨溢出到我的測試系統的問題。

我很可能會去使用一個數據庫表來保存所選的ID,並使用連接獲取從數據庫中直接數據

感謝(我會用數據庫進行排序和過濾或者方式)的解決方案@DariusX。爲「獲勝」的建議和其他人的幫助。

1

mybe你有快速訪問像HashSet的東西。

1

可以使用TreeSet,javadoc中說,它「提供了保證的log(n)時間爲基本操作成本(添加,刪除和包含)」,如果你需要的東西鏈接到您的ID,使用HashMap

0

1.因爲您需要持有數千個ID,所以HashMap是一個答案。如果密鑰已知並且快速插入,它具有非常快的訪問。

2.一般而言,treemap & hashmap不同步,但hashtable是同步的。同時,hashtable不允許空鍵或值。另一方面,hashMap允許一個空密鑰。

3.您也可以去TreeMap,因爲TreeMap允許我們按照用戶定義的某種排序順序檢索元素。嗯,我認爲TreeMap慢於HashMap

編輯: 閱讀幾篇文章,我碰到這個人來和後嗯..

說真的,你最好不要使用Hashtable 。對於單線程應用程序,您不需要額外的同步處理開銷。對於高度併發的應用程序,偏執異步可能導致飢餓,死鎖或不必要的垃圾收集暫停。像蒂姆·豪蘭指出,你可以使用 ConcurrentHashMap的,而不是

,我就用ConcurrentHashMap

0

HashSet去應提供快速訪問,並在大多數概率會不斷地訪問,但我想,如果可行的話,您可以運行樣本測試來檢查由於數百萬條目和數據集性質而導致的衝突是否過高。

這肯定無法滿足您的最佳內存要求,您希望將數百萬條記錄保存到Java內存中時的大小是多少?如果它的佔用空間非常大(比如說1000的MB),則可能需要考慮分佈式緩存或者考慮索引方法。