2015-09-29 4 views
1

Я разрабатываю программу анализа текста, которая представляет документы как массивы «счетчиков функций» (например, вхождения определенного токена) в пределах некоторого заранее определенного пространства объектов. Эти массивы сохраняются в ArrayList после некоторой обработки.Обработка больших массивов, которые не соответствуют оперативной памяти в Java

Я тестирую программу на 64-битном наборе данных с 50 000 записей. Программа отлично работала с небольшими наборами данных, но теперь она последовательно выдает исключение «из памяти» Java heap exception, когда я начинаю загрузку массивов в объект ArrayList (используя метод .add (double [])). В зависимости от того, сколько памяти я выделяю в стек, я получу это исключение в 1000-ом и 3000-м дополнениях к ArrayList, что намного меньше моих 50 000 записей. Мне стало ясно, что я не могу хранить все эти данные в ОЗУ и работать с ним, как обычно.

Тем не менее, я не уверен, какие структуры данных лучше всего подходят для доступа и выполнения расчетов по всему набору данных, когда только часть его может быть загружена в ОЗУ?

Я думал, что сериализация данных на диск и сохранение местоположений в хэш-карте в ОЗУ будет полезна. Тем не менее, я также видел обсуждения по кэшированию и буферизации.

Я на 100% уверен, что это общая проблема с CS, поэтому я уверен, что есть несколько разумных способов решения этой проблемы. Все указатели будут оценены :-)

+0

Используйте datadase, который позволит либо запросить небольшое подмножество, либо выполнить какой-либо другой анализ (например, запущенные функции или объединения) и который поддерживает курсоры (поэтому он не загружает весь набор в память) или какой-либо другой кеш памяти/сопоставления – MadProgrammer

+0

@MadProgrammer благодарит ... как насчет файлов с отображением карты памяти? –

+0

Прежде чем использовать файлы с отображением памяти (непосредственно), это трудно сказать. Моя основная проблема заключалась бы в том, что если данные должны быть «Serializable» – MadProgrammer

ответ

2

У вас есть много вариантов:

  • Увеличить размер кучи (-Xmx) до нескольких гигабайт.
  • Не используйте коллекции бокса, используйте fastutil - это должно уменьшить использование памяти 4 раза. http://fastutil.di.unimi.it/
  • Обработайте свои данные партиями или последовательно - не храните весь массив данных одновременно.
  • Используйте соответствующую базу данных. Существуют даже внутрипроцессные базы данных, такие как HSQL, ваш пробег может отличаться.
  • Обработайте данные через карту-сокращение, возможно, что-то локальное, как свиньи.
+0

Спасибо! Я пытался увеличить размер кучи ... не собираюсь работать. Я рассматриваю использование разреженных массивов для уменьшения объема хранилища, и я смотрю в fastutil. Три были моим следующим выбором. Мне нравится идея внутрипроцессного БД ... это тоже рассмотрит. MapReduce может быть излишним, но его вариант тоже. –

0

Как насчет использования Apache Spark (Отлично подходит для кластерных вычислений в памяти)? Это поможет масштабировать вашу инфраструктуру по мере того, как ваш набор данных будет больше.

+0

Хммм ... –

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