Оптимизация разбора VTD-XML?

Мне нужно сделать тест производительности на библиотеке VTD-XML, чтобы сделать не просто парсинг, а дополнительную трансформацию в парсинге. Итак, у меня есть входной XML размером 30 МБ, а затем я преобразую его с помощью пользовательской логики в другой XML. ТАК Я хочу удалить все мысли, которые замедляют весь процесс, исходящий с моей стороны (из-за неправильного использования библиотеки VTD). Пытался найти советы по оптимизации, но не нашел. Я заметил, что:

«0». Что лучше использовать для выбора selectXPath или selectElement?

  1. Использовать синтаксический анализ без пространства имен гораздо быстрее.

    File file = new File(fileName);
    VTDGen vtdGen = new VTDGen(); 
    vtdGen.setDoc_BR(new byte[(int) file.length()]); 
    vtdGen.parse(false);
    
  2. Чтение из байта или передача в VTDGen ?

    final VTDGen vg = new VTDGen();
    vg.parseFile("books.xml", false);
    

or

// open a file and read the content into a byte array
File f = new File("books.xml");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
fis.read(b);

VTDGen vg = new VTDGen();
vg.setDoc(b);
vg.parse(true);

Используя второй подход - в 0,01 раза быстрее... (можно от всего)

В чем разница с parseFile, файл ограничен до 2 ГБ с истинным пространством имен и без 1 ГБ, но что за байтовый подход?

  1. Повторное использование буферов

Вы можете попросить VTDGen повторно использовать буферы VTD для следующей задачи синтаксического анализа. В противном случае по умолчанию VTDGen будет выделять новый буфер для каждого запуска синтаксического анализа.

Можете ли вы привести пример для этого?

  1. Отрегулируйте уровень LC до 5

По умолчанию это 3. Но вы можете установить его на 5. Когда ваш XML глубоко вложен, установка уровня LC на 5 приводит к лучшей производительности XPath. Но это немного увеличивает использование памяти и время синтаксического анализа.

    VTDGen vg = new VTDGen();
    vtdGen.selectLcDepth(5);

Но есть исключение во время выполнения. Работает только с 3

  1. Индексация

Используйте индексацию VTD+XML. Вместо того, чтобы анализировать XML-файлы во время обработки запроса, вы можете предварительно проиндексировать свой XML в формат VTD+XML и сбросить их на диск. Когда начнется обработка запроса, просто загрузите VTD+xml в память и вуаля, синтаксический анализ больше не нужен!!

  VTDGen vg = new VTDGen();
    if (vg.parseFile(inputName,true)){
       vg.writeIndex(new FileOutputStream(outputName));
     }

Может кто знает как им пользоваться? Что произойдет, если файл будет изменен, как отключить новую переиндексацию. И если есть изменение 10kb в 3GB, парсинг займет время для парсинга всего нового файла или только для измененных строк?

  1. функция перезаписи

Функция перезаписи, также известная как. шаблоны данных. Поскольку VTD-XML сохраняет XML в памяти как есть, вы можете фактически создать XML-файл шаблона (предварительно проиндексированный в vtd + xml), поля значений которого оставлены пустыми, и позволить вашему приложению заполнить пробел, создавая таким образом XML-данные. которые никогда не нужно анализировать.


person Xelian    schedule 17.08.2016    source источник


Ответы (1)


Я думаю, вам следует взглянуть на примеры, связанные с выпуском vtd-xml... и постепенно накапливать опыт... к счастью, vtd-xml, на мой взгляд, является одним из самых простых XML API с большим отрывом... так что кривая обучения не будет сложной для SAX/STAX.

Мой ответ на ваши пронумерованные списки выше...

  1. selectXPath предназначен для оценки xpath. selectElement похож на getElementByTag().

  2. включение осведомленности о пространстве имен практически не влияет на производительность синтаксического анализа... можете ли вы сослаться на источник вашего утверждения о 100-кратном замедлении?

  3. вы можете читать из байтов или читать из файлов напрямую... вот ссылка на сообщение в блоге

    https://ximpleware.wordpress.com/2016/06/02/parsefile-vs-parse-a-quick-comparison/

3. Повторное использование буфера — это несколько продвинутая функция... давайте вернемся к этому позже.

4. Если вы получите последнюю версию (2.13), вы не получите исключение во время выполнения с этим вызовом метода...

  1. для анализа XML-документа размером более 2 ГБ вам необходимо переключиться на расширенную версию vtd-xml, которая представляет собой отдельный API в комплекте со стандартным vtd-xml...

  2. Есть примеры, связанные с дистрибутивом vtd-xml, которые вы, возможно, захотите посмотреть в первую очередь... вот статья на эту тему http://www.codeproject.com/Articles/24663/Index-XML-Документы-с-VTD-XML

person vtd-xml-author    schedule 17.08.2016