OutOfMemory Ошибка пространства кучи Java - PullRequest
2 голосов
/ 17 августа 2010

Я использую этот оператор

//some code
int a[][]=new int[5000000][5000000];
//some code

и запускаю его с помощью команды

java -mx512m Test

Это дает OutOFMemoryError: пространство кучи Java, указывающее номер строки упомянутого оператора вstacktrace

Как мне решить эту проблему

Редактировать: Я пытаюсь решить практическую проблему на codechef

Ответы [ 9 ]

8 голосов
/ 17 августа 2010

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

Из Google Calculator (при условии 64-битного целого размера):

(5 000 000^2) * 64 bits = 186 264.515 gigabytes
5 голосов
/ 16 августа 2015

Я столкнулся с той же проблемой с Eclips относительно Java-кучи. и решением было преобразовать mx512m в mx4096m или mx2048m (расширить максимально допустимый предел памяти) так что в вашем случае попробуйте команду java -mx4096m Тест, который позволит java использовать 4 ГБ вашего ОЗУ

4 голосов
/ 17 августа 2010

Я думаю, что структура данных, которую вы ищете, является разреженной матрицей. Сохраните ваши элементы вместе с их координатами в структуре данных карты (например, Map<Integer,Map<Integer,Integer>> для 2d разреженного массива) и просто предположите, что все, что не на карте, равно нулю.

3 голосов
/ 17 августа 2010

Ну, это 25 триллионов, каждая из которых занимает 4 байта, то есть 100 триллионов байтов.Самое простое решение - купить ~ 90 терабайт оперативной памяти и 64-разрядную ОС.

Если серьезно, то правильным решением, вероятно, является выделение более разумной структуры данных, которая может хранить данные более эффективно, если выФактически необходимо загрузить 90 терабайт данных в оперативную память одновременно.Возможно, если вы напишете больше о проблеме, мы сможем дать лучший ответ?

1 голос
/ 17 августа 2010

Среди других ответов у вас есть опечатка в вашей команде.

Должно быть: java -Xmx512M Test

0 голосов
/ 17 августа 2010

Это матрица с 5 миллионами столбцов и 5 миллионами строк.Вы действительно этого хотели?

0 голосов
/ 17 августа 2010

Вам нужна более просвещенная структура данных.Если вам НЕ НУЖНО 25 триллионов целых чисел, что сомнительно.

0 голосов
/ 17 августа 2010

для int [5000000] [5000000] вам нужно 100000000000000B или 100000GB.Таким образом, вы можете ждать около 100 лет только тогда, когда это станет возможным.

0 голосов
/ 17 августа 2010

Вы используете слишком много памяти.Используйте меньше или больше.Каждый элемент int является 32-битным.И ваш предел памяти в 512 МБ намного меньше, чем вы думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...