2012-10-24 37 views
2

我正在處理單個數據結構的一些相對較大的實例數組。每個實例由大約六個字段組成。陣列佔用了大量的空間,我發現即使使用7千兆字節的堆空間運行虛擬機時,我的開發環境也會死亡。儘管我可以搬到更大的機器,但我也在探索如何在不犧牲性能的情況下節省空間。在檢查數據時,我注意到數據中有很多冗餘。對於大約80%的數據,六個字段中的四個具有相同的值。使用靜態變量節省數組中的空間

這給了我這樣一個想法,即我可以分離這些具有冗餘信息的實例,並將它們放入數據結構的特殊形式(原始數據結構的擴展)中,其中包含四個字段的靜態字段相同的信息。我的假設是靜態字段只會在內存中實例化一次,即使這些信息被100K對象共享,這些字段也會佔用與只有一個數據結構實例化時相同的內存。因此,我應該能夠實現顯着的內存節省。

這是一個正確的假設嗎?

謝謝

埃利奧特

+4

如果不知道數據結構以及如何填充數據,很難說明問題。似乎並沒有將數據聲明爲靜態或非真實的。重要的是共享重複的數據。 –

+0

如果您不需要對陣列進行即時訪問,則可以使用LinkedList來提高性能。另一種解決方案將使用類似對象實例的池而不是靜態字段,請記住'static'屬於類,而不屬於實例。 –

+0

另一個可能的問題是,如果您將來需要一個具有不同價值的字段,那麼您無法將其設爲靜態 – smk

回答

2

我不知道你的具體的數據結構和算法可能以打造專業化一個輕量級的,但我會建議之一: http://en.wikipedia.org/wiki/Flyweight_pattern

的模式是相當接近你正在考慮的解決方案,併爲您提供好好分離「如何獲取數據」。

0

如何維護是在地圖多餘的,只是在陣列這些值引用的字段。可以通過減少單個數據結構的大小來節省空間。

0

嘗試使用HashMap進行存儲。這是快速找到平等對象的方式。 您需要思考如何定義對象的hashCode函數。