2012-02-24 3 views
2

У меня есть xml-документ размером ~ 10 МБ. Он имеет относительно простую структуру, но в нем много бинарных данных. Мне нужно получить данные из него и сохранить его в db. Tried jaxb metro - работает очень медленно. В настоящее время я пытаюсь использовать jibx для этого, но unmarshalling несколько XML-документов использует всю память jvm - ошибка в куче пространства - db получает поврежден. Может быть, я должен использовать что-то еще для чтения xmls? пожалуйста, дайте несколько советов.Обработка XML - проблема с производительностью

Редактировать Мой XML представляет собой вид сообщения с информацией, как «в», «с», и т.д., просто строки Интс и даты. Самая большая часть - это прикрепленные файлы в байте [], каждое вложение в свой собственный элемент. Может быть, его можно загрузить по одному? Я действительно не делаю то, что должен делать.

ответ

1

Вы можете использовать stax, это хороший ответ для быстрого глотания/генерации xml. Теперь это часть jvm, очень проста в использовании. Тебе понравится :-).

Дело в том, что вы четко определяете каждый элемент и приступаете к чтению файла. Вы выполняете цикл по элементам (начало/конец) и получаете легкий доступ к их атрибутам. Это дает вам точную информацию о том, что вы хотите сделать. Также не все загружается в память, как в DOM.

Есть много учебников онлайн. Вот первая страница, о которой я нашел на веб-сайте oracle. http://docs.oracle.com/javaee/5/tutorial/doc/bnbem.html

+0

Спасибо за предложение! Должен ли я попробовать реализацию woodstox или по умолчанию? – emmma1223

+1

Я думаю, что по умолчанию это будет сделано. Хотя я ничего не знаю об woodstox. – unludo

+0

Стакс отлично работает. Спасибо. – emmma1223

1

Преобразование данных из модели XML в модель Java, чтобы вы могли преобразовать ее в модель базы данных, чувствует, что все неправильно для меня. Ищите инструменты, которые поддерживают XML в базе данных, не проходя через объекты Java - если ваша база данных не имеет импорта XML, ищите сторонний инструмент. Модуль XSLT-SQL Saxon, вероятно, не подходит для обработки двоичных данных, но, вероятно, есть инструменты.

+0

, но мне нужны только некоторые данные. Мне не нужно хранить весь XML-документ. Это происходит так: я получаю xml; Мне нужно получить некоторые значения из некоторых элементов; сохраните их в db. – emmma1223

1

Самый простой подход, который вы могли бы использовать, - это DOM (много примеров в Google).

Это предварительно загружает всех данных для построения в памяти структуры дерева и поэтому было бы быстро и с 10 МБ не настолько велико, вы могли бы попробовать, что (конечно, в памяти представление будет больше).

Также DOM - это самый простой и простой в использовании API, который вы могли бы использовать.

Другая библиотека, которую вы могли бы попробовать, - Simple XML. Он очень легкий и API выглядит как JAXB, но он более интуитивно понятен и проще.

Если вы пытаетесь выполнить эти действия, вы все еще чувствуете, что вам нужно что-то с меньшими потребностями в памяти, вы можете использовать какой-то синтаксический анализатор, основанный на потоке, например. Stax, но API очень отличается и IMO несколько «труднее» использовать

+0

Разница в сложности API-интерфейсов Simple XML и JAXB (JSR-222) действительно невелика (см. Http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to- simple.html). Кроме того, поскольку JAXB является стандартным связующим слоем веб-сервиса для JAX-WS (SOAP) и JAX-RS (RESTful), JAXB гораздо проще использовать в этих средах. –

+0

Спасибо за предложения! Но разве jaxb уже не использует stax? Для чего использовать память? Я профилировал jaxb unmarshalling для моего XML-документа, и он использует ~ 100-150 Мб памяти; jibx использует на 25-50% меньше. Еще раз спасибо. – emmma1223

+1

. При правильном управлении вашими экземплярами stax использует очень мало памяти (то есть, рано освобождая их). – unludo

2

Unludo является правильным, что вам нужно использовать Stax, чтобы этот процесс как можно более эффективные - есть на самом деле 5 различные способы разбора XML в Java, я обрисовал them all here наряду с плюсами/минусами.

Все, что содержит весь контент в ram (DOM или XPath), будет слишком интенсивным в памяти. SAX намного лучше, но он по-прежнему анализирует элементы, когда он их ударяет, и передает их в реализацию вашего обработчика, в то время как STAX не будет разбирать что-либо из потока, пока вы его не попросите; он только выдает вам события, чтобы вы знали, на что он смотрит.

Это, как говорится, я создал SJXP parsing library встроенный ontop STAX для обеспечения производительности STAX с простотой использования XPath.

Вы буквально определить пути в файле вы заинтересованы, как:

/message/data -- represents the <message><data>[STUFF HERE]</data></message> path 

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

Реализация гиперэффективна (я не шучу, я потратил дни, чтобы профилировать ее, чтобы получить накладные расходы на реализацию НИЖЕ базовых классов STAX, чтобы она не добавила никаких измеримых накладных расходов) и очень проста в использовании.

ПРИМЕЧАНИЕ Вы сказали, что ваш байт [], который поставляется с каждым сообщением, является «отдельными файлами», я не уверен, что вы имеете в виду здесь в контексте XML-анализа; Я думаю, что некоторые из нас, вероятно, предположили, что ваши двоичные данные были закодированы base64 внутри ваших XML-сообщений, если это не так, и у вас есть вспомогательные полезные данные с каждым сообщением, идущим по проводу, что вы хотите сделать сохранить использование памяти на низком уровне - это поток данных (фрагмент за раз) с провода непосредственно в вашу базу данных.

Если ваша база данных не позволяет потоковой передаче вставлять значения в сегмент за раз и нуждается в полном байте [] blob, то просто вытащите этот байт [] из провода и в БД как можно скорее, чтобы сохранить память низкий уровень использования; если это действительно 1 МБ необработанных данных, то каждый из них, вероятно, то, что выдувает вашу кучу, особенно если есть много одновременных соединений.

Если вы хотите поделиться больше данных о своих намерениях, я уверен, что мы сможем помочь с предложениями.

+0

Спасибо за ответ, Рияд. Я собираюсь попробовать вашу библиотеку как можно скорее, она отлично подходит для моих нужд. Для части ПРИМЕЧАНИЕ: я действительно задал отдельный вопрос о блобах из xml и использования памяти, если у вас есть время, пожалуйста, проверьте его http://stackoverflow.com/questions/9512646/stax-reading-base64-string-from- XML-в-дб # comment12049388_9512646. – emmma1223