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

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

Сообщение Anonymous »

Для разработчиков Java, вероятно, общеизвестно, что примитивные типы не поддерживаются для универсальных типов.
Поэтому при создании двойного списка или списка int я использую его коробочный тип «Double». "
или "Целое число". (например, 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)]);
}
Просто взглянув на приведенный выше код, вы легко увидите, что он работает без проблем.
Моя цель — создать два массива примерно 700 000 000 элементов.

Подробнее здесь: https://stackoverflow.com/questions/791 ... s-possible
Ответить

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

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

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

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

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