Я скомпилировал и запустил программу. Через несколько мгновений программа выдает OOME.
Что происходит?
Размер double составляет 8 байт, но для класса размер «по умолчанию» составляет 12 байт (Double — 16 байт).
Поскольку размер массива очень велик (не менее 1 000 000 000), мне необходимо защитить много места в памяти и убедитесь, что пространство не используется зря. Я хочу хранить как можно больше элементов, используя как можно меньше памяти.
Можно выделить массив, но у меня недостаточно места для выделения списка. Есть ли способ заменить это?
Вот мой код для реализации этой проблемы.
Код: Выделить всё
public static void main(String[] args){
int approxLength = 2000000000; //unknown
long cnt = 0;
Random random = SecureRandom.getInstanceStrong();
int length = approxLength;
List d1 = new ArrayList();
for (int index = 0; index < length; index++) {
d1.add((double)index);
cnt++;
if (cnt % 1000000 == 0) {
System.out.println(cnt);
}
}
System.out.println(d1.get(random.nextInt(d1.size())));
}
Код: Выделить всё
public static void main(String[] args){
int approxLength = 2000000000; //unknown
long cnt = 0;
Random random = SecureRandom.getInstanceStrong();
int length = approxLength;
double[] d1 = new double[approxLength];
for (int index = 0; index < length; index++) {
d1[index] = index;
cnt++;
if (cnt % 1000000 == 0) {
System.out.println(cnt);
}
}
System.out.println(d1[random.nextInt(d1.length)]);
}
Моя цель — создать два массива примерно 700000000 элементов без проблем. (Я предполагаю крайнюю ситуацию. На практике мне не нужен такой большой объем выделенной памяти. Я просто пытаюсь найти «оптимальный» способ хранения моих данных «максимум». Приведенный выше пример представляет собой недавно написанный код, который упрощает задачу, поэтому вполне естественно, что он неэффективен.)
Подробнее здесь: https://stackoverflow.com/questions/791 ... s-possible
Мобильная версия