2017-07-04 46 views
-3

我有一個巨大的數據集(7億行,大約30Gb),我需要加載所有到內存中。哪個更快,需要更少的內存? - 具有對象或其屬性的HashMap?

對於每一行,可以考慮像一個對象:

Class XX{ 
    private int id; 
    private int a; 
    private int b; 
    private int c; 
    /** 
    Some getters and setters; 
    */ 
} 

每一行都有一個唯一的ID ,以及其他三個屬性是獨立的,但他們需要配合他們的ID

我發現兩種方法將它們存儲在內存:

  1. HashMap中的值是一個Object XX

    HashMap<id, Object XX>

  2. 使用三種不同的包含HashMap,HashMap中的值是每屬性:

    HashMap<id, a>

    HashMap<id, b>

    HashMap<id, c>

我的問題是,該方法需要較少的內存? (在我的情況下,空間複雜性比時間複雜性更重要)

+1

當你嘗試時發生了什麼? –

+0

嘗試兩種方法並仔細測量它們。如果你採取系統的方法,我相信你可以自己回答這個問題。像[YourKit](https://www.yourkit.com)這樣的工具可以幫助您以非常精細的細節探索您的內存空間。 – tadman

+0

我試了他們兩個,結果是第二種方法需要更少的內存,但我不知道爲什麼。 –

回答

0

我注意到你的id的數據類型是一個int。如果您的ID都是無符號整數,那麼使用數組可能比使用HashMap更高效。

int maxId = 1000000000; //or whatever your maximum id is 
XX[] arr = new XX[maximumId+1]; 
for (XX dataPoint : myData){ 
    arr[dataPoint.id] = dataPoint; 
} 

數組中會有空值,所以會浪費一些空間。但是,即使它需要JVM允許的最大長度(我相信2^31 - 5),它仍然可能比擁有7億個密鑰的hashmap更緊湊。

+0

是的,這些ID都是未簽名的整數。但是如果我不提前知道最大ID,該怎麼辦? (因爲文件格式不正確,我需要自己拆分文件)。 –

相關問題