![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| olegrolik |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 309 Регистрация: 25.1.2006 Репутация: нет Всего: нет |
Не думал, что возникнет такая ошибка, т.к. SAX парсер предназначается именно для больших потоков данных.
Как бы то ни было, вот код:
Ошибка:
xml-файл доступен по ссылке - http://www.ozon.ru/multimedia/yml/partner/div_book.xml Может кто знает в чём дело? |
||||
|
|||||
| Skynin |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 6 Всего: 10 |
Увидевши:
10 раз вместо
и проверки в HashSet на допустимость qName смотреть больше не хочется Это сообщение отредактировал(а) Skynin - 9.4.2009, 10:57 |
||||
|
|||||
| olegrolik |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 309 Регистрация: 25.1.2006 Репутация: нет Всего: нет |
Этот момент не понял. А насчёт 10 раз - мой косяк. |
|||
|
||||
| ecologist |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 452 Регистрация: 28.2.2007 Репутация: 2 Всего: 9 |
Можно посмотреть еще StAX - мне даже больше понравилось.
|
|||
|
||||
| olegrolik |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 309 Регистрация: 25.1.2006 Репутация: нет Всего: нет |
StAx позволяет парсить потоки > 400 мегабайт? Мне кажется, SAX тоже позволяет работать с большими потоками данных (почти уверен Только что попробовал разобрать файл в 42 мегабайта - успешно. Это сообщение отредактировал(а) olegrolik - 9.4.2009, 11:44 |
|||
|
||||
| Skynin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 6 Всего: 10 |
А сколько от первоначального объема остается в памяти в виде нужных данных в ArrayList - посчитали? Если, скажем выбрасываются только xml теги, из 400Мб полезных данных 350, то 1. нужно подкручивать параметры хипа JVM 2. использовать встроенную базу данных и копировать туда (Apache Derby, H2, ..., ) |
|||
|
||||
| olegrolik |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 309 Регистрация: 25.1.2006 Репутация: нет Всего: нет |
Парсил файл размером в 43 536 988 байт. В коллекции насчитал 13 969 832 байта. Думаю соотношение у файла в 400 мегов будет такое же. Насчёт параметров JVM - я собираюсь поднимать приложение на хостинге, на самом дешёвом тарифе. Не думаю, что там можно увеличить память под мои нужды. |
||||
|
|||||
| Skynin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 6 Всего: 10 |
Считаем - (13 969 832/43 536 988)*400 = 128,34909Мб Выясняем - сколько по умолчанию дается. Если нельзя увеличить - используем встраиваемую БД (или предоставляемую хостером, MySQL или какая у него доступна) |
|||
|
||||
| olegrolik |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 309 Регистрация: 25.1.2006 Репутация: нет Всего: нет |
Резюме какое?
SAX читает любые потоки данных (звёздочка). звёздочка - в зависимости от используемой памяти вашей JVM. Получается ак? |
|||
|
||||
| Skynin |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 6 Всего: 10 |
Любой программе нужна память. Если ее недостаточно в комьютере для реализации алгоритма, то: либо нужно докупить либо менять алгоритм У JVM есть еще ограничение, с расчетом на то что на компьютере может работать масса других програм, которым тоже нужна память: настраиваемый размер разрешенного размера памяти для программы. Если ее недостаточно для реализации алгоритма, то: либо нужно увеличить эту квоту либо менять алгоритм Причем тут SAX? Если он, не может докупить памяти, не может увеличить квоту JVM? Резюме: Вам нужно либо учиться на программиста, либо бросать это дело, потому что в данном конкретном случае выделяете в алгоритме памяти 128,34909Мб лично ВЫ, лично Ваш алгоритм, а никакой не SAX или что угодно. То есть можно взять файл, размером 1 байт, и 134217728 раз добавить в ArrayList это байт и получить OutOfMemory и сделать вывод что функции чтения файла работают неправильно.
Это сообщение отредактировал(а) Skynin - 9.4.2009, 13:05 |
||||
|
|||||
| olegrolik |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 309 Регистрация: 25.1.2006 Репутация: нет Всего: нет |
Возникла новая проблема. SAX пропускает символы. Некорректно распознаёт тэг categoryId.
например у товара с offerId=4295594, categoryId=109 вместо 1099413
Что здесь может быть? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Неправильное использование метода characters(). Этот метод не обязан сразу передавать все данные которые идут внутри тега, он может это следовать несколько последовательных вызовов. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| olegrolik |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 309 Регистрация: 25.1.2006 Репутация: нет Всего: нет |
Правда чтоль? Если серьёзно, то и так понятно, что проблема в этом методе. Вчера в инете нашёл ответ на мой вопрос вот он: http://www.coderanch.com/t/432967/XML-Rela...with-SAX-Parser Надо использовать вместо
Как-то так. Короче помогло. |
||||||
|
|||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |