Импорт большого файла XML (100 тыс. Записей) в базу данных - PullRequest
2 голосов
/ 02 сентября 2011

Я сталкиваюсь с проблемой при синтаксическом анализе XML. Это занимает 47% процессора и очень медленно. Похоже, DOM загружает XML в память и оттуда начинает читать дерево XML узел за узлом.

Я читаю узел и выгружаю его в базу данных.

Мне нужно решение, в котором я могу читать XML без загрузки в память.

Я использую JDK1.4.2_05.

Ответы [ 3 ]

4 голосов
/ 02 сентября 2011

Ищите SAX-парсер, это единственный способ сделать что-то с XML без создания полного DOM в памяти. Есть некоторые ограничения, но, возможно, они подойдут вам.

0 голосов
/ 06 сентября 2011

Проект Nux включает класс StreamingPathFilter . С этим классом вы можете объединить средства потоковой передачи и малый объем памяти SAX с простотой использования DOM.

Но это работает, только если ваш XML-документ имеет структуру, похожую на запись. Например. много элементов <person/>.

(Следующие примеры взяты с сайта Nux и изменены мной)

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

StreamingTransform myTransform = new StreamingTransform() {
  public Nodes transform(Element person) {
    // Process person element, i.e. store it in a database
    return new Nodes(); // mark element as subject to garbage collection
  }
}; 

Затем вы создаете StreamingPathFilter, передающий выражение XPath, которое соответствует вашим узлам записи.

// parse document with a filtering Builder
NodeFactory factory = new StreamingPathFilter("/persons/person", null).
                            createNodeFactory(null, myTransform);
new Builder(factory).build(new File("/tmp/persons.xml"));

Библиотека Nux больше не поддерживается. Но это все еще полезно.

0 голосов
/ 02 сентября 2011

Попробуйте StAX или SAX.

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