| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > sax parser. файл 402 mgb. java heap space error |
| Автор: olegrolik 9.4.2009, 10:27 | ||||
| Не думал, что возникнет такая ошибка, т.к. SAX парсер предназначается именно для больших потоков данных. Как бы то ни было, вот код:
Ошибка:
xml-файл доступен по ссылке - http://www.ozon.ru/multimedia/yml/partner/div_book.xml Может кто знает в чём дело? |
| Автор: Skynin 9.4.2009, 10:56 | ||||
Увидевши:
10 раз вместо
и проверки в HashSet на допустимость qName смотреть больше не хочется |
| Автор: olegrolik 9.4.2009, 11:01 | ||
Этот момент не понял. А насчёт 10 раз - мой косяк. |
| Автор: ecologist 9.4.2009, 11:14 |
| Можно посмотреть еще StAX - мне даже больше понравилось. |
| Автор: olegrolik 9.4.2009, 11:42 | ||
StAx позволяет парсить потоки > 400 мегабайт? Мне кажется, SAX тоже позволяет работать с большими потоками данных (почти уверен Только что попробовал разобрать файл в 42 мегабайта - успешно. |
| Автор: Skynin 9.4.2009, 11:54 | ||
А сколько от первоначального объема остается в памяти в виде нужных данных в ArrayList - посчитали? Если, скажем выбрасываются только xml теги, из 400Мб полезных данных 350, то 1. нужно подкручивать параметры хипа JVM 2. использовать встроенную базу данных и копировать туда (Apache Derby, H2, ..., ) |
| Автор: olegrolik 9.4.2009, 12:19 | ||||
Парсил файл размером в 43 536 988 байт. В коллекции насчитал 13 969 832 байта. Думаю соотношение у файла в 400 мегов будет такое же. Насчёт параметров JVM - я собираюсь поднимать приложение на хостинге, на самом дешёвом тарифе. Не думаю, что там можно увеличить память под мои нужды. |
| Автор: Skynin 9.4.2009, 12:37 | ||
Считаем - (13 969 832/43 536 988)*400 = 128,34909Мб Выясняем - сколько по умолчанию дается. Если нельзя увеличить - используем встраиваемую БД (или предоставляемую хостером, MySQL или какая у него доступна) |
| Автор: olegrolik 9.4.2009, 12:52 |
| Резюме какое? SAX читает любые потоки данных (звёздочка). звёздочка - в зависимости от используемой памяти вашей JVM. Получается ак? |
| Автор: Skynin 9.4.2009, 13:00 | ||||
Любой программе нужна память. Если ее недостаточно в комьютере для реализации алгоритма, то: либо нужно докупить либо менять алгоритм У JVM есть еще ограничение, с расчетом на то что на компьютере может работать масса других програм, которым тоже нужна память: настраиваемый размер разрешенного размера памяти для программы. Если ее недостаточно для реализации алгоритма, то: либо нужно увеличить эту квоту либо менять алгоритм Причем тут SAX? Если он, не может докупить памяти, не может увеличить квоту JVM? Резюме: Вам нужно либо учиться на программиста, либо бросать это дело, потому что в данном конкретном случае выделяете в алгоритме памяти 128,34909Мб лично ВЫ, лично Ваш алгоритм, а никакой не SAX или что угодно. То есть можно взять файл, размером 1 байт, и 134217728 раз добавить в ArrayList это байт и получить OutOfMemory и сделать вывод что функции чтения файла работают неправильно.
|
| Автор: olegrolik 13.4.2009, 17:44 | ||
| Возникла новая проблема. SAX пропускает символы. Некорректно распознаёт тэг categoryId. например у товара с offerId=4295594, categoryId=109 вместо 1099413
Что здесь может быть? |
| Автор: LSD 13.4.2009, 17:51 |
Неправильное использование метода characters(). Этот метод не обязан сразу передавать все данные которые идут внутри тега, он может это следовать несколько последовательных вызовов. |
| Автор: olegrolik 14.4.2009, 10:23 | ||||||
Правда чтоль? Если серьёзно, то и так понятно, что проблема в этом методе. Вчера в инете нашёл ответ на мой вопрос вот он: http://www.coderanch.com/t/432967/XML-Related-Technologies/Missing-characters-with-SAX-Parser Надо использовать вместо
Как-то так. Короче помогло. |