Что является альтернативой использованию синтаксического анализатора DOM XML для больших документов XML для нескольких операций поиска? - PullRequest
1 голос
/ 13 марта 2012

Я храню данные для ранжирования пользователей в документах XML - по одной строке на пользователя - в качестве атрибутов используются ключ из 36 символов, оценка, ранг и имя пользователя.

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE Ranks [<!ELEMENT Rank ANY ><!ATTLIST Rank id ID #IMPLIED>]>
<Ranks>
..<Rank id="<userKey>" score="36.0" name="John Doe" rank=15></Rank>..
</Ranks>

Существует несколько таких документов, которые анализируются по запросу с использованием синтаксического анализатора DOM и хранятся в памяти до обновления файла. Это происходит изнутри HttpServlet, который поддерживает виджет. Каждый раз, когда виджет загружается, он вызывает сервлет с запросом get, который затем запрашивает один из документов. Запросы к документам требуют следующих операций:

  • Посмотрите вверх - найти конкретный идентификатор
  • Итерация по каждому элементу Rank и получение атрибута id

В моей тестовой среде количество пользователей

Мне не хватает идей для реализации, которая балансирует производительность и использование памяти. Хотя DOM хорош для операций поиска, он может подавиться из-за большого размера. Я не знаю много о StAX, но из того, что я прочитал, кажется, что это может решить проблему с памятью, но может действительно замедлить запросы, так как мне придется эффективно перебирать документ, чтобы найти интересующий элемент ( правильный?).

Вопросы:

  • Можно ли использовать StAX для множественных операций поиска (например, getElementById) над большими документами достаточно быстро, чтобы обработать запрос HttpRequest?
  • Какой максимальный размер файла может обрабатывать анализатор DOM?
  • Можно ли оценить, сколько памяти на пользователя будет использовано для документа XML с вышеуказанной структурой?

Спасибо

Редактировать: мне не разрешено использовать базы данных.

Редактировать: Было бы лучше / аккуратнее использовать вместо этого пользовательский отформатированный файл и использовать регулярные выражения для поиска в файле требуемой записи?

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Одна из больших проблем здесь заключается в том, что DOM не является потокобезопасным, поэтому даже операции чтения должны быть синхронизированы. С этой точки зрения использование JDOM или XOM определенно было бы лучше.

Другой проблемой является стратегия поиска, используемая для поиска данных. Вы действительно хотите, чтобы запросы поддерживались индексацией, а не последовательным поиском. На самом деле вам нужен приличный оптимизатор запросов для генерации эффективных путей доступа. Таким образом, учитывая ваше ограничение не использовать базу данных, это звучит как случай для механизма XQuery в памяти с агрессивной оптимизацией, для которого очевидным кандидатом является Saxon-EE. Но тогда я бы сказал, не так ли?

2 голосов
/ 13 марта 2012

Похоже, вы используете XML-документ в качестве базы данных. Я думаю, вы будете намного счастливее, используя для этого подходящую базу данных и импортируя / экспортируя в xml по мере необходимости. Несколько баз данных работают хорошо, поэтому вы можете также использовать хорошо поддерживаемую базу данных, такую ​​как mysql или postgresql, хотя даже sqlite будет работать лучше, чем xml.

С точки зрения синтаксического анализа SAX вы в основном строите большой конечный автомат, который обрабатывает различные события, возникающие при синтаксическом анализе (ввод тега, оставление тега, просмотр данных и т. Д.). Тогда вы самостоятельно управляете памятью (записываете данные, которые видите, в зависимости от состояния, в котором вы находитесь), поэтому вы правы, что у него может быть лучший объем памяти, но для каждого веб-запроса выполняется такой запрос. Смешно, особенно если вы можете хранить все свои данные в хорошей индексированной базе данных.

0 голосов
/ 16 апреля 2016

Для интенсивной обработки XML VTD-XML является наиболее эффективным вариантом из доступных, он гораздо более эффективен, чем JDOM, DOM4j или DOM ... ключом является не-объектно-ориентированный подход к моделированию информационного набора ...это также гораздо реже вызывает исключение из-за нехватки памяти ... Прочитайте этот документ 2013 года для всестороннего сравнения / эталона между различными структурами XML

Обработка XML с Java - тест производительности

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