Я пишу приложение, которое обрабатывает много XML-файлов (> 1000) с глубокими структурами узлов. Требуется около шести секунд с помощью woodstox (Event API) для анализа файла с 22 000 узлов.Параллельный анализ XML в Java
Алгоритм помещается в процесс с пользовательским взаимодействием, где допустимо только несколько секунд отклика. Поэтому мне нужно улучшить стратегию обработки XML-файлов.
- Мой процесс анализирует XML-файлы (извлекает только несколько узлов).
- Обработанные фрагменты обрабатываются, и новый результат записывается в новый поток данных (в результате получается копия документа с модифицированными узлами).
Теперь я думаю о многопоточном решении (которое масштабируется лучше на 16-ядерном оборудовании). Я думал о следующих стратегиях:
- Создание нескольких парсеров и их параллельное использование в источниках xml.
- Переписывая мой алгоритм синтаксического анализа потоков сохранить использовать только один экземпляр парсера (фабрики, ...)
- Split источник XML на куски и назначить куски в несколько потоков обработки (map-reduce xml - serial)
- Оптимизация моего алгоритм (лучше StAX анализатор чем Woodstox?)/Использование парсера с встроенным параллелизмом
Я хочу, чтобы улучшить и, производительность в целом и «в файл» производительность.
У вас есть опыт работы с такими проблемами? Каков наилучший способ?
Непонятно, что здесь нужно максимизировать ... производительность в файле SINGLE или общую производительность на всех 1000 файлах. –
Еще одно предложение: если вы можете количественно определить размеры файлов, чтобы позволить вычислять всю (обработанные мегабайты в секунду), это может дать представление о ожидаемой производительности. Я обычно получаю 10 - 40 МБ/с для разбора с помощью Woodstox при тестировании; но мои жесткие диски могут обеспечить только 5 - 10 Мбайт/с. – StaxMan
Вы посмотрели на vtd-xml? это современное состояние в области тяжелой обработки ... оно намного эффективнее SAX или stax? –