哪个更快,需要更少的内存? - 带有对象或其属性的HashMap?

时间:2017-07-04 19:46:05

标签: java hashmap time-complexity space-complexity

我有一个庞大的数据集(7亿行,大约30Gb),我需要将所有加载到内存中。

对于每一行,它可以被视为一个对象:

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. 使用三个不同的HashMaps,HashMap的值是每个属性:

    HashMap<id, a>

    HashMap<id, b>

    HashMap<id, c>

  3. 我的问题是,哪种方法需要更少的内存? (就我而言,空间复杂性比时间复杂度更重要)

1 个答案:

答案 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更紧凑。