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 МБ необработанных данных, то каждый из них, вероятно, то, что выдувает вашу кучу, особенно если есть много одновременных соединений.
Если вы хотите поделиться больше данных о своих намерениях, я уверен, что мы сможем помочь с предложениями.
Спасибо за предложение! Должен ли я попробовать реализацию woodstox или по умолчанию? – emmma1223
Я думаю, что по умолчанию это будет сделано. Хотя я ничего не знаю об woodstox. – unludo
Стакс отлично работает. Спасибо. – emmma1223