Работа с огромными списками массивов, Java OutOfMemoryError: пространство кучи Java ... использовать db? - PullRequest
1 голос
/ 11 января 2011

У меня проблема с памятью, я полностью понимаю причину, но понятия не имею, как исправить. Я попытался использовать тег -Xmx2g и увеличить размер кучи, но, похоже, скрытый максимум. (если я использовал -Xmx512m, мне одновременно не хватает места).

Предположим, у меня есть 2 объекта, область и пользователь. Объект My Area содержит ArrayList пользователей:

public class Area {
      int numUsers;
      ArrayList<User> userList;
}

Мой класс User содержит ArrayList друзей:

public class User {
      int userID;
      int numFriends;
      ArrayList<User> friends;
}

Просто используя одну область, с 1 миллионом пользователей и в среднем 200 друзьями на пользователя, я исчерпал пространство кучи после того, как создано около 680 000 пользователей. Очевидно, что если я уменьшу среднее число друзей / пользователей до значения, близкого к 100, я смогу сохранить все эти объекты в куче.

Что если я хочу смоделировать 2 миллиона пользователей в области? Или сотни областей?

Имея столько данных, является ли база данных единственным возможным способом для моделирования с использованием информации?

Ответы [ 3 ]

1 голос
/ 11 января 2011

Диск / база данных - это только решение, если вы можете позволить себе потерю производительности произвольного доступа в 100 000 раз (возможно, существует множество систем, использующих базу данных).Вы можете сделать намного лучше со специализированными структурами данных.Выполнение чего-то особенного для полностью подключенных подсетей может сэкономить много места.

1 голос
/ 11 января 2011

Конечно, вы можете запустить более чем на 2 м на 64-битной Java, но это не решит проблему.Кстати, для Area вам, вероятно, нужен id (не numUsers), число пользователей / друзей можно получить из list.size ()

База данных / дисковое хранилище - естественное решение для представления большого количества объектов,Вы также можете использовать кластер серверов (помимо запуска огромного ящика с 500 + ГБ памяти)

Чтобы ответить на вопрос, вы должны предоставить еще несколько данных: в чем смысл областей / графов друзей / и т. д..


Если вы можете кодировать свою собственную структуру (ure) с помощью ByteBuffer (что, вероятно, не простая задача), вы можете выйти за пределы 32-битных ограничений с помощью java.io.MappedByteBuffer, ScatteringByteChannel / GatheringByteChannel.Тем не менее, это не новичок в любом случае, но если вы любите программирование, я бы посоветовал вам попробовать свои силы.

Желаю вам удачи в учебе.

0 голосов
/ 11 января 2011

Чтобы получить доступ к большему количеству динамической памяти, перейдите на 64-разрядную ОС и 64-разрядную JVM.Если у вас проблемы с -Xmx512m, вы используете 32-битную ОС и / или JVM.

...