相关疑难解决方法(0)

使用libxml-ruby chunk处理大型XML文件

我想在Ruby中使用libxml 读取包含超过一百万个小书目记录(如)的大型XML文件<article>...</article>.我已经尝试将Reader类与该expand方法结合使用来按记录读取记录,但我不确定这是正确的方法,因为我的代码占用了内存.因此,我正在寻找一个如何方便地处理记录的配方,并且内存使用量不断增加.以下是我的主循环:

   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
Run Code Online (Sandbox Code Playgroud)

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

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

def first(root, node)
    x = root.find(node).first
    x …
Run Code Online (Sandbox Code Playgroud)

ruby stream libxml-ruby

4
推荐指数
1
解决办法
3718
查看次数

标签 统计

libxml-ruby ×1

ruby ×1

stream ×1