Мне нужно сделать тест производительности на библиотеке VTD-XML, чтобы сделать не просто парсинг, а дополнительную трансформацию в парсинге. Итак, у меня есть входной XML размером 30 МБ, а затем я преобразую его с помощью пользовательской логики в другой XML. ТАК Я хочу удалить все мысли, которые замедляют весь процесс, исходящий с моей стороны (из-за неправильного использования библиотеки VTD). Пытался найти советы по оптимизации, но не нашел. Я заметил, что:
«0». Что лучше использовать для выбора selectXPath или selectElement?
Использовать синтаксический анализ без пространства имен гораздо быстрее.
File file = new File(fileName); VTDGen vtdGen = new VTDGen(); vtdGen.setDoc_BR(new byte[(int) file.length()]); vtdGen.parse(false);
Чтение из байта или передача в 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 ГБ, но что за байтовый подход?
- Повторное использование буферов
Вы можете попросить VTDGen повторно использовать буферы VTD для следующей задачи синтаксического анализа. В противном случае по умолчанию VTDGen будет выделять новый буфер для каждого запуска синтаксического анализа.
Можете ли вы привести пример для этого?
- Отрегулируйте уровень LC до 5
По умолчанию это 3. Но вы можете установить его на 5. Когда ваш XML глубоко вложен, установка уровня LC на 5 приводит к лучшей производительности XPath. Но это немного увеличивает использование памяти и время синтаксического анализа.
VTDGen vg = new VTDGen();
vtdGen.selectLcDepth(5);
Но есть исключение во время выполнения. Работает только с 3
- Индексация
Используйте индексацию VTD+XML. Вместо того, чтобы анализировать XML-файлы во время обработки запроса, вы можете предварительно проиндексировать свой XML в формат VTD+XML и сбросить их на диск. Когда начнется обработка запроса, просто загрузите VTD+xml в память и вуаля, синтаксический анализ больше не нужен!!
VTDGen vg = new VTDGen();
if (vg.parseFile(inputName,true)){
vg.writeIndex(new FileOutputStream(outputName));
}
Может кто знает как им пользоваться? Что произойдет, если файл будет изменен, как отключить новую переиндексацию. И если есть изменение 10kb в 3GB, парсинг займет время для парсинга всего нового файла или только для измененных строк?
- функция перезаписи
Функция перезаписи, также известная как. шаблоны данных. Поскольку VTD-XML сохраняет XML в памяти как есть, вы можете фактически создать XML-файл шаблона (предварительно проиндексированный в vtd + xml), поля значений которого оставлены пустыми, и позволить вашему приложению заполнить пробел, создавая таким образом XML-данные. которые никогда не нужно анализировать.