2010-05-05 10 views
3

Я разбираю огромные файлы xhtml и пытаюсь поиграть с содержимым в нем. В основном слова в нем, их позиции и т. Д. Я попытался использовать HashMap, ArayList и т. Д. Все они выдают OutOfMemory после загрузки данных 130347. Какова структура данных, которая может использоваться для хранения огромных данных в JAVA.Какую структуру данных я должен использовать для обработки огромных данных.

+3

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

+0

Насколько велика ваша xhtml-файл? –

+0

Я получаю эту проблему с файлом 5 МБ. Я нацелен на поддержку файла до 10 МБ. – Rachel

ответ

0

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

+0

Вы хотите сказать, что информация, которую я собираю из документа, можно записать в hsqldb с надлежащей структурой данных на локальном диске, а не загружать в память, чтобы можно было запросить то, что мне нужно, по мере необходимости. Поскольку мне нужно это только для этого запроса, в конце обработки мне нужно удалить мои вставки? Это довольно интересно. Я не применял hsqldb-решения для приложений реального времени. Не могли бы вы рассказать мне компромисс, который мне нужно сделать для такого решения, как производительность, так как мне придется вставлять огромное количество данных, делающих много звонков? – Rachel

+0

Какую базу данных вы бы предложили использовать, временно загрузить данные для запроса и очистить их в конце запроса. – Rachel

+0

XML-файл размером 10 Мбайт ни в коем случае не является «огромными данными», поэтому база данных диска, вероятно, слишком переполнена. – intgr

1

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

Одним из способов сделать это может быть анализ документа с использованием SAX, который использует подход, основанный на событиях. Вы можете создать обработчик содержимого и сохранить объекты, которые вы создаете, из чтения элементов xml, обработать их, как только они накопились, а затем очистить коллекцию.

+0

Спасибо, я попробую с SAX – Rachel

+0

. На этом сайте есть другой ответ, описывающий использование SAX в сочетании с некоторой библиотекой xml-object-model (вероятно, JDOM), если я могу ее найти, я добавлю ссылку на этот ответ. –

+0

Thats great. Это будет очень полезно. Спасибо – Rachel

1

Просмотрите настройки вашей виртуальной машины. Вы можете изменить размер памяти виртуальной машины через командную строку, если это где вы находитесь, или через файл конфигурации, если вы находитесь в какой-то среде на стороне сервера.

Если вы используете TOMCAT/затмение, этот поток должен помочь вам: Eclipse memory settings when getting "Java Heap Space" and "Out of Memory"

+0

Хорошая точка. Если вы запускаете приложение из командной строки, вы можете передать что-то вроде -Xmx4G, чтобы он мог использовать 4 гигабайта памяти. – intgr

+0

Я бегу на сервере tomcat из затмения. – Rachel

2

Рассмотрите возможность использования SAX парсер, меньше памяти интенсивно.

+0

Спасибо, я попробую с SAX. – Rachel

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