Как я могу использовать Nokogiri, чтобы написать ОГРОМНЫЙ файл XML? - PullRequest
8 голосов
/ 09 февраля 2011

У меня есть приложение Rails, которое использует delayed_job в функции отчетов для запуска некоторых очень больших отчетов. Один из них генерирует массивный XML-файл, и он может занять буквально дни в плохом, старом способе написания кода. Я подумал, что, увидев впечатляющие тесты в Интернете, Nokogiri может позволить нам несколько нетривиальный прирост производительности.

Однако единственные примеры, которые я могу найти, включают использование Nokogiri Builder для создания объекта xml, а затем использование .to_xml для написания всего этого. Но в моем почтовом индексе недостаточно памяти для обработки файла такого размера.

Так можно ли использовать Nokogiri для потоковой передачи или записи этих данных в файл?

1 Ответ

5 голосов
/ 09 февраля 2011

Nokogiri предназначен для построения памяти, потому что вы создаете DOM, и он конвертирует его в XML на лету.Его легко использовать, но есть компромиссы, и одним из них является его использование в памяти.

Возможно, вы захотите использовать Erubis для генерации XML.Вместо того, чтобы собирать все данные перед обработкой и сохранением логики в контроллере, как мы это делали с Rails, для экономии памяти вы можете поместить свою логику в шаблон и сделать так, чтобы она перебирала ваши данные, что должно помочь с потребностями в ресурсах,

Если вам нужен XML в файле, вам может понадобиться сделать это с помощью перенаправления:

erubis options templatefile.erb > xmlfile

Это очень простой пример, но он показывает, что вы можете легко определить шаблон для генерацииXML:

<% 
asdf = (1..5).to_a 
%>
<xml>
  <element>
<% asdf.each do |i| %>
    <subelement><%= i %></subelement>
<% end %>
  </element>
</xml>

, который, когда я вызываю erubis test.erb, выдает:

<xml>
  <element>
    <subelement>1</subelement>
    <subelement>2</subelement>
    <subelement>3</subelement>
    <subelement>4</subelement>
    <subelement>5</subelement>
  </element>
</xml>

РЕДАКТИРОВАТЬ:

Конкатенация строк выполнялась вечно...

Да, это может просто из-за сбора мусора.Вы не показываете пример кода того, как вы строите свои строки, но Ruby работает лучше, когда вы используете << для добавления одной строки к другой, чем при использовании +.

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

Опять же, без примеров кодаЯ снимаю в темноте о том, что ты можешь делать или почему дела идут медленно.

...