我有一个Rails应用程序,它在报告功能中使用delayed_job来运行一些非常大的报告。其中一个生成了一个庞大的XML文件,它可能需要几天时间才能编写代码。我认为,在互联网上看到令人印象深刻的基准测试后,Nokogiri可以为我们带来一些非常重要的性能提升。
然而,我能找到的唯一例子涉及使用Nokogiri Builder创建一个xml对象,然后使用.to_xml来编写整个事物。但是我的邮政编码中没有足够的内存来处理这种大小的文件。
那么我可以使用Nokogiri将这些数据流式传输或写入文件吗?
答案 0 :(得分:5)
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可以更好地工作。
最好不要尝试将所有内容保存在字符串中,而是将其立即写入磁盘,然后在打开时附加到打开的文件中。
同样,如果没有代码示例,我会在黑暗中拍摄你可能在做什么或为什么事情变得缓慢。