2013-09-18 7 views
0

У меня есть плоская структура XML объемом 5 МБ, которую я хочу получить позже. Я использую XOM Parser в Java для синтаксического анализа XML, и я не хочу, чтобы цикл на все дерево каждый раз, когда я хочу получить данные, поскольку требуется время из-за размера файла.Структура данных Java для хранения плоских данных XML для последующего доступа

XML-выглядит следующим образом

<TypeDesc Type="Person" Id="1" PKey="X0" xml:lang="EN" ShDes="t1" LongDes="test 1"/> 
<TypeDesc Type="Person" Id="2" PKey="X1" xml:lang="EN" ShDes="t2" LongDes="test 2"/> 
<TypeDesc Type="Person" Id="3" PKey="X3" xml:lang="EN" ShDes="t3" LongDes="test 2"/> 
... 
<TypeDesc Type="Person" Id="n" PKey="PAYMN" xml:lang="EN" ShDes="PAYMN" LongDes="payment"/> 
<TypeDesc Type="Student" Id="1" PKey="X0" xml:lang="EN" ShDes="t1" LongDes="good"/> 
<TypeDesc Type="Student" Id="2" PKey="X1" xml:lang="EN" ShDes="t2" LongDes="bad"/> 
<TypeDesc Type="Student" Id="3" PKey="X3" xml:lang="EN" ShDes="t3" LongDes="fair"/> 
... 
<TypeDesc Type="Student" Id="n" PKey="PAYMN" xml:lang="EN" ShDes="PAYMN" LongDes="fair"/> 

В моей LOGIC я хочу, чтобы извлечь longDes из узлов, если PKEY = SOMESTUFF И Type = OtherStuff

зацикливание на все это и получение, если longDes другие атрибуты удовлетворяются очень дорого.

Как сохранить мои данные, чтобы я мог получить к ним доступ в O (1) вместо O (n), чтобы я выполнял цикл всего XML за один раз и доступ к структуре данных для последующих итераций.

ответ

0

Я использовал хэш-таблицу для хранения данных. Построена хэш-таблица для каждого типа. Ключ каждой хэш-таблицы - это конкатенация всех атрибутов, с которыми я хочу проверить, и сохраненное значение - это то, что я хочу получить. Он очень эффективен и близок к O (1)

+0

Хотя это решение работает (но очень уродливое, но, тем не менее, решение), я думаю, что ваши рассуждения ошибочны. Я подозреваю, что вы предполагаете стоимость поиска: см. Http://stackoverflow.com/a/2771398/27385 –

1

Вы вряд ли найдете процедуру поиска по постоянному времени для ее удовлетворения в ее текущей форме. Кроме того, поиск по постоянному времени определенного требования или вы делаете это как часть мерцающей точки зрения статуса/настройки вашего проекта? А.К.А. "the XY problem". Лучшее, что вы, скорее всего, найдете, - это алгоритм O(n log n) или O(log n); см Big O Cheatsheet

Я рекомендую вам пересмотреть существующие рамки, которые позволят разбор этой структуры:

  1. Xstream
  2. JAXB
  3. XML Beans

Если вы счастливы с XOM, не беспокойтесь, перейдя, но я считаю, что вам нужно рассмотреть структуру данных, когда вы ищете, h, используя индекс или сохраняя его в эффективной форме - например, Дерево префикса/Trie - и затем сериализуйте его на диск/хранилище, чтобы повторный анализ был быстрее, чем очевидный компромисс между пространством и временем?

Кроме того, ваши данные имеют быть в XML? Можете ли вы преобразовать его в другой формат? Например, буферы протоколов или размещение данных в базе данных (SQL или NoSQL), хотя это может быть чрезмерным в зависимости от того, что вы делаете?

Я также задаюсь следующие вопросы:

  1. Как получить с учетом этой информации? Я теряю информацию, которая может помочь в поиске?
  2. Будет ли полезная помощь search algorithm?
  3. Эти данные отсортированы? Могу ли я сортировать его эффективно, чтобы последующие поисковые запросы были более эффективными?
+0

Это мой взгляд. Я просто не хочу, чтобы цикл снова и снова для каждого экземпляра Student \ Person я должен проверить значение его атрибутов. К сожалению, это стандартный формат, который я должен использовать. – mowienay

+0

Это хорошая точка зрения, не поймите меня неправильно, но требование постоянного времени может быть немного экстремальным и преждевременным. –

+0

Это нормально, без обид. Мне не нужна сложность O (1). Я просто не хочу O (n) в этом большом файле. Я уже использую синтаксический анализатор XOM, и он очень эффективен для моих требований. Считаете ли вы, что использовать одну из этих фреймворков вполне нормально. И как они собираются хранить мои данные. Как будто они хранят каждый узел в объекте, который не решает проблему – mowienay

 Смежные вопросы

  • Нет связанных вопросов^_^