Ruby / Rails解析XML而不将其全部加载到内存中

时间:2013-11-20 21:55:36

标签: ruby-on-rails xml xml-parsing

我想知道是否有一种简单的方法可以在rails中解析XML文档而无需将其全部加载到ram中。
我一直在使用(取决于XML)Nokogiri和标准Hash.from_xml的组合来获取XML的内容。
当我处理(试图导入)100甚至1000种产品时,这一切都很好。然而,当XML文档中有16,000或40,000个产品时....我的Dino开始真正感受到它。

所以我想知道是否有办法在不将内存全部存入内存的情况下使用XML。

抱歉,我没有代码....我试图避免写任何新内容。我的意思是谁想编写自己的XML解析器呃?

2 个答案:

答案 0 :(得分: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兆字节的文件中运行时,我看到了我的内存负载。它完成了我的目标。我很乐意看到其他答案。也许更轻松的东西。

答案 1 :(得分: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