2015-09-05 43 views
0

我們的應用程序是一個基於gigaspace的解決方案,它基本上從多個平面文件中讀取並將數據存儲在一個對象中。現在平面文件基本上包含一些裝運細節。因此,我們有多個文件java中的內存有效集合

  1. 船塢詳細
  2. 集裝箱詳情
  3. 貨運詳情

現在我們有Dockyard作爲父對象下有可裝運許多對象細節。我們目前使用ArrayList來維護近5萬個船塢詳細對象的裝運細節。目前的數據量表明,對於每個Dockyard對象,我們將不得不維護大約1500個裝運細節對象,並且將有近5萬個船塢對象躺在堆中。我們目前的堆是8GB。

所以想知道如果ArrayList的是要保持這麼多的目標的最佳途徑。我已經尋找其他的API,如troveHPPC,但它們大多在原始收集時提供好處。我們將是一個對象的集合。所以除了增加堆大小。有人可以建議任何其他更好的選擇。

+1

當數據的大小如此之大時,將數據保存在應用程序的內存中永遠不是一個好主意。 – afzalex

+0

我同意這一點,但最初我們並沒有期待這麼多的數據,所以內存中的數據網格似乎是一個快速和良好的解決方案,並且回溯,改變設計對我們來說將是一個相當大的挑戰,因爲我們正在接近UAT測試。 –

+0

你最好很快找出別的東西。如果你最初沒有預料到這麼多的數據,你覺得事情將在6個月後如何。你的實現不會擴展。 – Andreas

回答

1

您不需要將所有對象都放在堆上。以Chronicle Map爲例,您可以將所有對象關閉,因爲它們是內存映射文件,所以它們甚至不必在內存中。如果大部分數據不在堆中,您可能會發現可以減少堆大小。

將有近5萬船廠對象躺在堆。

這不是一個很大的對象。即使每個對象使用1 KB,那麼您也只使用50 MB。如果你的對象比這個大得多,那麼很可能你應該想辦法縮小單個對象的大小。

當我們使用基於原語集合它主要是爲了避免每個元素的對象頭。這節省了每個條目8-16個字節或最多800KB的情況。

但是,如果你的對象是1 KB至100 KB按照你的建議,你也許可以通過重組它們或使用不同的數據類型將減半,他們在使用內存的大小。

BTW 1 GB價值約的一個小時的時間。在花費太多時間之前,我會研究加倍內存大小。