Как я могу прочитать большой XML-файл в Ruby с помощью libxml-ruby? - PullRequest
2 голосов
/ 16 марта 2011

Мы используем libxml-ruby уже пару лет. Это фантастично для файлов размером 30 МБ или меньше, но оно ЗАТРАГИВАЕТСЯ ошибками сегмента. Никто в проекте, похоже, не хочет их исправлять, только обвиняя их в стороннем программном обеспечении. Это их прерогатива, конечно, это бесплатно.

Но я до сих пор не могу прочитать эти большие файлы. Полагаю, я мог бы написать какой-нибудь жалкий взлом, чтобы разбить их на более мелкие файлы, но я бы хотел этого избежать. У кого-нибудь еще есть опыт чтения очень больших XML-файлов в Ruby?

Ответы [ 4 ]

6 голосов
/ 16 марта 2011

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

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

4 голосов
/ 16 марта 2011

Спасибо всем за ваш превосходный вклад.Я смог решить свою проблему, посмотрев на Обработка большого XML-файла с помощью фрагмента libxml-ruby с помощью фрагмента .

Ответ был таков:

reader.expand

и вместо этого используйте:

reader.read

или:

reader.next

в сочетании с:

reader.node

Пока вы не пытаетесь сохранитьузел как есть, отлично работает.Вы хотите немедленно работать с этим узлом, потому что reader.next унесет его.

Чтобы ответить на более ранний ответ, насколько я понимаю, libxml-ruby - это анализатор потоковой передачи.Проблемы с ошибками сегмента возникли при сборе мусора, который вызывал большие утечки памяти.Как только я научился не использовать reader.expand, все пришло в порядок.

ОБНОВЛЕНИЕ:

Я не смог решить мою проблему в конце концов.Похоже, нет никакого способа добраться до поддерева без использования reader.expand.

И поэтому я полагаю, что нет способа прочитать и проанализировать большой XML-файл с помощью libxml-ruby?Ошибка reader.expand утечки памяти была открыта даже без ответа с 2009 года?FAIL FAIL FAIL.

3 голосов
/ 16 марта 2011

libxml-ruby действительно содержит множество ошибок, не только сбоев, но и несовместимости версий, утечек памяти и т. Д. *

Я настоятельно рекомендую Нокогири . Сообщество Ruby сплотилось вокруг Nokogiri как новый источник быстрого анализа XML. Он имеет синтаксический анализатор считываний , SAX-анализатор и ваш стандартный анализатор DOM-памяти в памяти .

Для действительно больших файлов XML я бы порекомендовал Reader, потому что он такой же быстрый, как SAX, но его легче запрограммировать, потому что вам не нужно отслеживать такое большое количество состояний вручную.

3 голосов
/ 16 марта 2011

Я бы порекомендовал посмотреть на SAX XML-парсер . Они предназначены для обработки огромных файлов. Мне не нужно было время от времени, но они довольно просты в использовании; Когда он читает XML-файл, он передает вашему коду различные события, которые вы перехватываете и обрабатываете с помощью своего кода.

Сайт Nokogiri содержит ссылку на SAX Machine , основанную на Nokogiri, так что это будет другой вариант. В любом случае, Nokogiri очень хорошо поддерживается и используется многими людьми, включая меня, для всех HTML и XML, которые я анализирую. Он поддерживает синтаксический анализ DOM и SAX, позволяет использовать средства доступа CSS и XPath и использует libxml2 для своего анализа, поэтому он быстрый и основан на стандартной библиотеке синтаксического анализа.

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