我如何使用Nokogiri来编写一个巨大的XML文件?

我有一个Rails应用程序,它在报告功能中使用delayed_job来运行一些非常大的报告。 其中一个会生成一个大规模的XML文件,并且可能需要几天时间才能完成编写代码的糟糕的旧方式。 我认为,在互联网上看到了令人印象深刻的基准,Nokogiri可以为我们带来一些不平凡的性能收益。

但是,我可以找到的唯一示例包括使用Nokogiri Builder创建xml对象,然后使用.to_xml写入整个事物。 但是我的邮政编码中没有足够的内存来处理这个大小的文件。

那么我可以使用Nokogiri来传输或写入这些数据到文件吗?


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更好。

它也可能更好地工作,不要试图将所有内容都保存在一个字符串中,而是将其立即写入磁盘,并随时添加到打开的文件中。

再次,没有代码示例,我在黑暗中拍摄了你可能在做什么或为什么事情运行缓慢。

链接地址: http://www.djcxy.com/p/50703.html

上一篇: How can I use Nokogiri to write a HUGE XML file?

下一篇: ZookeeperConnectionException in HBase Standalone mode