Обработка XML-файла с огромными данными - PullRequest
2 голосов
/ 20 марта 2010

Я работаю над приложением, которое соответствует требованиям -

  1. Загрузить ZIP-файл с сервера.
  2. Распакуйте ZIP-файл, получите содержимое (в формате XML) из этого файла в строку.
  3. Передайте это содержимое в другой метод для анализа и дальнейшей обработки.

Теперь меня беспокоит то, что XML-файл может быть огромного размера, скажем, «100 МБ», а моя JVM имеет память всего 512 МБ, так как я могу получить этот контент в чанки и передать для анализа, а затем вставить данные в таблицы PL / SQL.

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

Как я могу получить данные в чанки и передать их как поток для анализа XML.

Ответы [ 2 ]

5 голосов
/ 20 марта 2010

Java XMLReader - это синтаксический анализатор SAX2. Когда анализатор DOM считывает весь XML-файл и создает (часто большую) структуру данных (обычно дерево) для представления его содержимого, SAX-анализатор позволяет зарегистрировать обработчик, который будет вызываться, когда части XML-документа распознан. В этом коде обратного вызова вы можете сохранить только достаточно данных, чтобы сделать то, что вам нужно - например, Вы можете сохранить все поля, которые в итоге окажутся в базе данных одной строкой, вставить эту строку и затем отбросить данные. При таком типе проектирования потребление памяти вашей программой зависит в меньшей степени от размера файла, чем от сложности и размера одного логического элемента данных (в вашем случае это данные, которые станут одной строкой в ​​базе данных).

Даже если вы использовали парсер DOM-стиля, все может быть не так плохо, как вы ожидаете. XML довольно многословен, поэтому (в зависимости от его структуры и т. Д.) Файл размером 100 МБ часто представляет только 10-20 МБ данных, и всего 5 МБ данных не будут особенно редкими или невероятными.

3 голосов
/ 20 марта 2010

Любой парсер SAX должен работать, так как он не загружает весь XML-файл в память, как парсер DOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...