首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >逐块处理包含libxml-ruby块的大型XML文件

逐块处理包含libxml-ruby块的大型XML文件
EN

Stack Overflow用户
提问于 2010-01-04 23:12:51
回答 2查看 3.8K关注 0票数 4

我想阅读一个大型的XML文件,其中包含超过一百万个小书目记录(比如<article>...</article>),它使用了Ruby。我尝试过将Reader类与expand方法结合使用,以逐条记录地读取记录,但我不确定这是不是正确的方法,因为我的代码会占用内存。因此,我正在寻找一个配方,如何方便地处理记录与恒定的内存使用率的记录。下面是我的主循环:

代码语言:javascript
运行
复制
   File.open('dblp.xml') do |io|
      dblp = XML::Reader.io(io, :options => XML::Reader::SUBST_ENTITIES)
      pubFactory = PubFactory.new

      i = 0
      while dblp.read do
        case dblp.name
          when 'article', 'inproceedings', 'book': 
            pub = pubFactory.create(dblp.expand)
            i += 1
            puts pub
            pub = nil
            $stderr.puts i if i % 10000 == 0
            dblp.next
          when 'proceedings','incollection', 'phdthesis', 'mastersthesis':
            # ignore for now
            dblp.next 
          else
            # nothing
        end
      end  
    end

这里的关键是dblp.expand读取整个子树(就像<article>记录一样),并将其作为参数传递给工厂进行进一步处理。这是正确的方法吗?

在工厂方法中,我使用类似于XPath的高级表达式来提取元素的内容,如下所示。再说一次,这可行吗?

代码语言:javascript
运行
复制
def first(root, node)
    x = root.find(node).first
    x ? x.content : nil
end

pub.pages   = first(node,'pages') # node contains expanded node from dblp.expand
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-05 03:28:15

在处理大的XML文件时,您应该使用流解析器,以避免在内存中加载所有内容。有两种常见的方法:

  • Push解析器,如SAX,您可以在获取标签时对其做出反应(参见tadman answer)。
  • 拉式解析器,您可以控制XML文件中的“光标”,您可以使用go up/go down等简单原语移动它。

我认为,如果您只想检索一些字段,那么使用推式解析器是很好的,但是对于复杂的数据提取来说,使用推式解析器通常很麻烦,而且通常使用case... when...构造来实现

在我看来,拉式解析器是基于树的模型和推式解析器之间的一个很好的选择。您可以在Dobb博士的日志中找到关于使用REXML的拉式解析器的nice article

票数 5
EN

Stack Overflow用户

发布于 2010-01-04 23:19:47

处理XML时,有两个常见的选项是基于树的和基于事件的。基于树的方法通常会读入整个XML文档,并且会消耗大量内存。基于事件的方法不使用额外的内存,但不会做任何事情,除非您编写自己的处理程序逻辑。

SAX风格的解析器和派生实现采用了基于事件的模型。

使用REXML的示例:http://www.iro.umontreal.ca/~lapalme/ForestInsteadOfTheTrees/HTML/ch08s01.html

REXML:http://ruby-doc.org/stdlib/libdoc/rexml/rdoc/index.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2000118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档