2015-10-08 6 views
0

Я пытаюсь написать простую программу, которая будет моделировать сценарий, описанный в вероятностном вопросе. Для этого я попытался создать и заполнить большой 2-мерный массив, но компилятор продолжает говорить, что размер кучи java недостаточно велик, и когда я выделяю больше памяти для JVM, процесс ест мой CPU до такой степени, что мой ноутбук падает (заметьте, это ультрабук с i7 и 8 ГБ оперативной памяти). Это просто невозможно/рекомендуется в Java? Есть ли другой способ? Пожалуйста помоги!Java: Как создать большой двумерный массив

Это линия, что проблема (2-мерный массив с 5^12 строк и 12 столбцов):

int[][] sequences = new int[244140625][12]; 

P.S. Я немного начинаю, когда дело доходит до программирования ... спасибо заранее!

+2

Итак, немного советов: если вы хотите, чтобы структура данных * это * большая, вам нужна база данных, а не массив в памяти. – Makoto

+0

Я вижу, но как бы реализовать базу данных? Это просто еще одна структура данных, например массивы или массивы? – DavidSGK

+0

Это поддерживается * структурой данных - часто B-деревом, но вы обычно смотрите на решения СУБД, такие как MySQL или PostgreSQL. – Makoto

ответ

4

каждый int на Java - 4 байт большой. 244140625 из них берут уже 931MiB ОЗУ. Вы хотите это x 12. Итак, 10.91GiB. Java, насколько мне известно, справляется с этим, но этих 8 гигабайт памяти у вас недостаточно.

База данных, такая как H2 (http://www.h2database.com/html/main.html), легко интегрируется и может быть заменена на диск. Или вы придумали лучший алгоритм, который не должен хранить значения 5^12x12.

0

Ваш размер массива

244140625*12*4 = 11718750000 byte 
11718750000%(1024*1024*2024) = 10.91 GB 

Таким образом, только ваш массив нужно ГБ памяти 10.91, так что это не представляется возможным реализовать его с массивом. В качестве альтернативы вы можете использовать базу данных, например MySQL, PostgreSQL или другие решения СУБД, которые созданы для обработки огромного объема данных.

2

Это на самом деле хуже, чем говорят.

int[12] (как минимум) 4 байта для указателя на класс + 4 байта для длины массива + 12 * 4 байта для значений = 56 байт.

Внешний массив затем использует 4 байта на указатель, поэтому вы получаете 244,140,625 * (56 + 4) = 14,648,437,500 = 13,6 Gb памяти.

Это мощь работы при запуске 64-разрядной Java с -Xmx16g, но он будет работать вечно со всеми пейджинга происходит, когда у вас есть только 8 Гб, и это предполагает, что указатели являются только 4 байта (сжатый).

Смежные вопросы