2

Nokogiri を使用して解析中に「メモリの割り当てに失敗しました」という問題に直面しています。そのために、次のコードを書きました。

require 'open-uri'
require 'nokogiri'
f = File.open("/my_pplications/XML/one.xml")
doc = Nokogiri::XML(f)    
stack = Hash.new
doc.children.each do |x|  
  x.children.each do |sx|
   sx.children.each do |v|      
     stack[v.name] = v.text      
   end 
  end 
end


ここで、one.xmlファイルsmallerのサイズが適切であれば、すべてを解析して取得できます。しかし、そのファイルがtoo large(more than 700MB)の場合、 のようなエラーが発生します"[FATAL] failed to allocate memory"。では、完全な大きな XML ファイルを解析するにはどうすればよいでしょうか。

誰でも私を助けてもらえますか?

4

1 に答える 1

4

Nokogiri::XML は、ドキュメント全体のインメモリ表現を構築するため、ドキュメントのディスク上のサイズよりもはるかに多くのメモリを使用します。その後、それを繰り返し処理し、xpath または css クエリを使用するのは簡単です。

別の方法は、nokogiri の SAX パーサーを使用することです。sax パーサーは、ドキュメント全体をメモリに格納するわけではないため、メモリ オーバーヘッドはほとんどありません。ドキュメントをウォークスルーし、提供されたオブジェクトに、タグ foo が開始された、テキストが見つかった、foo タグが閉鎖など

一般に、高レベルのインターフェースよりもこれを使用する方が少し手間がかかりますが、この方法で膨大な XML ファイルをむさぼり食うことができます

于 2013-03-29T09:03:15.777 に答える