【问题标题】:How can I use Nokogiri to write a HUGE XML file?如何使用 Nokogiri 编写一个巨大的 XML 文件?
【发布时间】:2011-02-09 01:52:36
【问题描述】:

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

但是,我能找到的唯一示例涉及使用 Nokogiri Builder 创建一个 xml 对象,然后使用 .to_xml 编写整个内容。但是我的邮政编码中没有足够的内存来处理这种大小的文件。

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

【问题讨论】:

  • 通常字符串连接对于许多 xml 编写任务来说就足够了,尽可能避免构建树...
  • 字符串连接需要很长时间。常规的老建筑商已经显示出改进。文件可以超过 1 GB。

标签: ruby-on-rails ruby xml nokogiri


【解决方案1】:

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>

编辑:

字符串连接需要很长时间......

是的,它可以仅仅因为垃圾收集。您没有展示任何有关如何构建字符串的代码示例,但是当您使用 &lt;&lt; 将一个字符串附加到另一个字符串时,Ruby 比使用 + 时效果更好。

最好不要尝试将所有内容都保存在一个字符串中,而是立即将其写入磁盘,并随时追加到打开的文件中。

同样,如果没有代码示例,我会在黑暗中拍摄关于您可能在做什么或为什么事情运行缓慢的原因。

【讨论】:

  • 你的暗射很准,这个原力很强。这段代码实际上是用于驻留在 lib 中的 ruby​​ 报告,我发现 Builder,它确实在运行中写入 io 对象,大大提高了性能。谢谢!
  • 啊。很高兴它有帮助。只是不要用完磁盘,否则它会运行得无限慢。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多