我有一个庞大的数据集(7亿行,大约30Gb),我需要将所有加载到内存中。
对于每一行,它可以被视为一个对象:
Class XX{
private int id;
private int a;
private int b;
private int c;
/**
Some getters and setters;
*/
}
每一行都有一个唯一的 ID ,其他三个属性是独立的,但它们需要与 id 匹配。
我发现了两种将它们存储在内存中的方法:
HashMap的值是Object XX
:
HashMap<id, Object XX>
使用三个不同的HashMaps,HashMap的值是每个属性:
HashMap<id, a>
HashMap<id, b>
HashMap<id, c>
我的问题是,哪种方法需要更少的内存? (就我而言,空间复杂性比时间复杂度更重要)
答案 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更紧凑。