2013-11-20 3 views
1

Мне интересно, есть ли простой способ проанализировать XML-документ в рельсах, не загружая его все в ram.
Я использовал (в зависимости от XML) комбинацию Nokogiri и стандартного Hash.from_xml, чтобы получить содержимое XML.
Это все хорошо и хорошо, когда я занимаюсь (пытается импортировать) 100 или даже 1000 продуктов. Однако, если XML-документ содержит 16 000 или 40 000 продуктов ... ну, мой Дино начинает действительно чувствовать это.Ruby/Rails анализирует XML без загрузки всего его в память

Так что мне интересно, есть ли способ проложить XML, не втягивая все это в память.

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

ответ

0

Поскольку XML является иерархическим, парсер должен знать всю структуру для правильного его анализа. Вы могли бы кормить хорошо сформированные фрагменты до Nokogiri::HTML::Document.parse, но вам нужно было бы получить эти фрагменты другим способом.

Допустим, у вас есть огромный XML-документ:

<products> 
    <product>stuff</product> 
    <product>...</product> 
    ... and so on 
</products> 

Фактические продукты облекают в <products>, вырезать конверт часть, а затем с помощью строки расщепления, чтобы получить массив каждого <product> и его содержание. Затем проанализируйте каждый из них как фрагменты XML. Просто мысль.

Это может помочь, хотя я никогда не использовал его: https://github.com/soulcutter/saxerator

1

Я пришел к этому ...

reader = Nokogiri::JSON::Reader(File.open('test.xml')) 

reader.each do |node| 
    if(node.name == 'Product') 
    hash = Hash.from_xml(node.outer_xml).values.first 
    break; 
    end 
end 

Я наблюдал мою загрузку памяти, когда я побежал это через файл в 60 мегабайта. Это выполнило мою цель. Мне бы хотелось увидеть другие ответы. Возможно, что-то еще легче.

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