2010-10-19 2 views
14

Мне нужен синтаксический анализатор xml для анализа файла размером около 1,8 града.
Поэтому анализатор не должен загружать весь файл в память.Java XML Parser для огромных файлов

Любые предложения?

+0

1,8 gb - ОГРОМНЫЙ текстовый файл. Разве это невозможно разбить на куски на уровне файлов? – Owen

+1

@Owen - это зависит от вашего домена. При взаимодействии с дампами данных из систем других людей такая ситуация может произойти очень легко. –

+0

Я не думал об этом, но я думаю, нам снова нужен такой синтаксический анализатор, чтобы не испортить xml-файл? это не будет практично делать это вручную или любое предложение, как это сделать? – mehmet6parmak

ответ

19

Помимо рекомендуемого анализа SAX, вы можете использовать STAX API (вид эволюции SAX), включенный в JDK (пакет javax.xml.stream).

+1

Хотя я согласен с тем, что StAX обычно является лучшим решением, бывают ситуации, когда SAX лучше. Если у вас есть документы, содержащие большие блоки текстового контента, AFAIR API StAX полностью прочитает эти блоки текста в памяти и обработает это как одно событие. Анализаторы SAX обычно разделяют их на меньшие куски и подают их обработчикам кусочно. Не гарантируется возможность воспользоваться этой возможностью, но в StAX эта возможность даже не существует. (Который я лично чувствую немного неудобно для потокового API.) –

+0

приветствие может кто-то, пожалуйста, улучшите мое понимание здесь. потому что у меня был вопрос интервью об этом, и ключевые слова, которые я ответил, были 'sax' и' thread', но все же ему нужно было третье ключевое слово, я ответил на пул потоков executer ... он сказал да и?! ~ ответ был приоритетной очередью один объясняет, как – shareef

+0

@ wilfred-springer Coalesce - это функция, которая может быть установлена ​​на XMLInputFactory. API StAX обычно поддерживает это так же, как SAX. См. Например, входной файл FasterXML. – ThomasRS

1

Используйте практически любые SAXParser, чтобы потоковой поток файла за раз.

3

Поток файла в парсер SAX и чтение его в память в кусках.

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

10

Используйте анализатор на основе SAX, который представляет вам содержимое документа в потоке событий.

3

Пробег: VTD-XML. Я обнаружил, что он более эффективен и, что более важно, проще в использовании, чем SAX.

+0

Как насчет лицензирования GPL? –

3

Как говорили другие, используйте синтаксический анализатор SAX, так как это потоковый анализатор. Используя различные события, вы извлекаете свою информацию по мере необходимости, а затем на лету храните ее где-то еще (база данных, другой файл, что у вас есть).

Вы даже можете сохранить его в памяти, если вам действительно нужно только небольшое подмножество, или если вы просто суммируете файл. Разумеется, зависит от варианта использования.

Если вы буферизируетесь в БД, убедитесь, что вы берете на себя заботу о том, чтобы ваш процесс был перезагружен или что-то еще. Многое может случиться в 1,8 ГБ, что может потерпеть неудачу в середине.

4

StAX API легче иметь дело с по сравнению с SAX. Вот short tutorial

+0

+10 для полезного учебника –

0

+1 для StaX. Это проще в использовании, чем SaX, потому что вам не нужно писать обратные вызовы (вы, по сути, просто перебираете все элементы времени, пока не закончите), и у него (AFAIK) нет ограничений по размеру файлов, которые он может обрабатывать ,

1

У меня была аналогичная проблема - мне пришлось прочитать целый XML-файл и создать структуру данных в памяти. В этой структуре данных (все должно было быть загружено) мне пришлось выполнять различные операции. Многие элементы XML содержали текст (который я должен был выводить в свой выходной файл, но не был важен для алгоритма).

Как явствует из предложенного здесь, я использовал SAX для анализа файла и создания моей структуры данных. Мой файл был 4 ГБ, и у меня была 8-гигабайтная машина, поэтому я подумал, что, возможно, 3 ГБ файла были только текстом и java.lang.Строка, вероятно, нуждается в 6 ГБ для текста, использующего UTF-16.

Если JVM занимает больше места, чем компьютер имеет физическую RAM, тогда машина будет меняться. Выполнение сбора мусора с меткой + sweep приведет к тому, что страницы получат доступ в случайном порядке, а также объекты, перемещаемые из одного пула объектов в другой, что в основном убивает машину.

Итак, я решил записать все свои строки на диск в файл (FS, очевидно, может обрабатывать последовательную запись 3GB просто отлично, а при чтении в ОС будет использовать доступную память для кеша файловой системы , все равно могут быть чтения с произвольным доступом, но меньше, чем GC в java). Я создал небольшой вспомогательный класс, который вы более чем можете скачать, если он вам поможет: StringsFile javadoc | Download ZIP.

StringsFile file = new StringsFile(); 
StringInFile str = file.newString("abc");  // writes string to file 
System.out.println("str is: " + str.toString()); // fetches string from file 
Смежные вопросы