Создайте список примитивных типов, выделив как можно меньше памяти.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Создайте список примитивных типов, выделив как можно меньше памяти.

Сообщение Anonymous »

Для разработчиков Java, вероятно, общеизвестно, что примитивные типы не поддерживаются для универсальных типов. Поэтому при создании двойного списка или целочисленного списка я использую его коробочный тип Double или Integer (например, List, List).
Я скомпилировал и запустил программу. Через несколько мгновений программа выдает 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())));
}
Когда максимальная емкость кучи виртуальной машины установлена ​​на 16 ГБ (-Xmx16g), OOME происходит на 532 000 000-й итерации. Я также пробовал это с LinkedList, но программа перестала работать на 356 000 000-й итерации.

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»