Создание очень, очень большой карты в Java - PullRequest
5 голосов
/ 27 сентября 2011

Используя Java, я хотел бы создать Карту, которая может расти и расти и может быть больше, чем размер доступной памяти.Теперь, очевидно, с помощью стандартного POJO HashMap у нас закончится память, и JVM потерпит крах.Таким образом, я подумал о том, что если карта узнает о нехватке памяти, она может записать текущее содержимое на диск.

Кто-нибудь реализовывал что-то подобное или знает о каких-либо существующих решениях?

Я пытаюсь прочитать очень большой ASCII-файл (скажем, 50Gb) по одной строке за раз,Каждая строка содержит ключ и значение.Ключи могут быть продублированы в файле.Затем я сохраню каждую строку на карте, которая является ключом к списку значений.Эта Карта - объект, который будет только расти и расти.

Любой совет, который очень ценится.

Фил

Обновление:

Спасибо за все комментарии и советы всем.С проблемой, которую я описал, база данных является правильным, масштабируемым решением.Я должен был заявить, что это временная карта, которую нужно создать и использовать в течение короткого периода времени для помощи в разборе файла.В этом случае предложение Майкла «хранить только номер строки вместо фактического значения» является наиболее подходящим.Пометить ответы Майкла как рекомендуемое решение.

Ответы [ 8 ]

13 голосов
/ 27 сентября 2011

Я думаю, что вы ищете базу данных.

3 голосов
/ 27 сентября 2011

База данных NoSQL, вероятно, будет проста в настройке и больше похожа на карту.Проверьте BerkeleyDB Java-версию, теперь от Oracle.Он имеет интерфейс, похожий на карту, может быть встраиваемым, поэтому не требуется сложной настройки

2 голосов
/ 27 сентября 2011

Серьезно, выберите простую базу данных в соответствии с рекомендациями. Это не накладные расходы & mdash; вам не нужно использовать JPA или еще много чего, просто JDBC с собственным SQL. Например, Derby или HSQL могут работать во встроенном режиме, не нужно определять пользователей, права доступа, запускать сервер отдельно.

«Сверхзадача» ударит вас в спину, когда вы углубитесь в решение хэш-карты, и выяснится, что вам нужна еще одна оптимизация, чтобы избежать исключения OutOfMemoryException, или файл имеет размер не 50 ГБ, а 75. .. Действительно, не ходи туда.

2 голосов
/ 27 сентября 2011

Звучит так, словно выгрузили ваш огромный файл в БД.

Ну, у меня была такая же ситуация, как эта. Но в моем случае все было в формате TXT, и весь файл имеет одинаковые отформатированные строки. Итак, я просто разбил файлы на несколько частей (возможно, что моя JVM сможет обработать максимальный размер). Затем я назвал файлы один за другим, чтобы их обработали.

Другим способом, вы можете напрямую загрузить свои данные в базу данных напрямую.

0 голосов
/ 09 ноября 2016

Большинство API-интерфейсов кеша работают как карты и поддерживают переполнение на диск. Ehcache , например, поддерживает это.Или следуйте этому руководству по guave .

0 голосов
/ 02 ноября 2011

Я использую BerkleyDB для этого, хотя это сложнее, чем Map (хотя у них есть оболочка Map, которую я не рекомендую ни для чего, кроме простых приложений)

http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html

Он также доступен в Maven http://www.oracle.com/technetwork/database/berkeleydb/downloads/maven-087630.html

  <dependencies>
    <dependency>
      <groupId>com.sleepycat</groupId>
      <artifactId>je</artifactId>
      <version>3.3.75</version>
    </dependency>
  </dependencies>

  <repositories>
    <repository>
      <id>oracleReleases</id>
      <name>Oracle Released Java Packages</name>
      <url>http://download.oracle.com/maven</url>
      <layout>default</layout>
    </repository>
  </repositories>

У него также есть еще один недостаток блокировки поставщика (т. Е. Вы вынуждены использовать этот инструмент. Хотя могут быть и другие обертки Map для некоторыхдругие базы данных)

Так что просто выбирайте в соответствии с вашими потребностями.

0 голосов
/ 27 сентября 2011

Сколько у вас памяти? Если у вас недостаточно памяти, чтобы хранить большую часть данных в памяти, она будет слишком медленной, возможно, она также потерпела неудачу. Программа, которая сильно страничит, может быть в 1000 раз медленнее или больше. Некоторые ПК имеют 16-24 ГБ, и вы можете подумать о том, чтобы получить больше памяти.

Предположим, что дубликатов достаточно, вы можете хранить большую часть данных в памяти. Я предлагаю вам использовать основанный на байтах класс String вашего собственного создания, поскольку у вас есть данные ASCII и вы храните свои значения в качестве другого из этих типов «String» (с разделителем). Вы можете обнаружить, что можете сохранить рабочий набор данных в памяти.

0 голосов
/ 27 сентября 2011

Если вы просто хотите создать карту для обработки данных (а не произвольного доступа в ответ на запросы), тогда MapReduce может быть тем, что вам нужно, без необходимости работать с базой данных..

Редактировать. Обратите внимание, что, хотя во многих введениях MapReduce основное внимание уделяется возможности запуска множества узлов, вы все равно должны получить выгоду от обхода требования хранить все данные в памяти на одном компьютере.

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