1.6gbのxmlファイルがあります.Sax Machineで解析すると、ストリーミングやチャンクでファイルを食べていないようです私のルビープロセスが2.5GB以上のRAMを登っているので、ファイル全体をメモリにロードすることができます(または、おそらくどこかでメモリリークがありますか?)。私は記憶がなくなったので成長が止まるところは分かりません。大きなファイルをSaxMachineで解析するとファイル全体がメモリにロードされているようです
小さいファイル(50MB)ではファイル全体が読み込まれているようです。私のタスクはxmlファイルのレコードを繰り返し処理し、各レコードをデータベースに保存します。 「アイドリング」が約30秒かかると、突然データベースクエリが実行を開始します。
私は、SAXがこのような大きなファイルをメモリにロードせずに作業できると思っていました。
私は見落としていることはありますか?
感謝
アップデートあなたが見ることができるように
class FeedImporter
class FeedListing
include ::SAXMachine
element :id
element :title
element :description
element :url
def to_hash
{}.tap do |hash|
self.class.column_names.each do |key|
hash[key] = send(key)
end
end
end
end
class Feed
include ::SAXMachine
elements :listing, :as => :listings, :class => FeedListing
end
def perform
open('~/feeds/large_feed.xml') do |file|
# I think that SAXMachine is trying to load All of the listing elements into this one ruby object.
puts 'Parsing'
feed = Feed.parse(file)
# We are now iterating over each of the listing elements, but they have been "parsed" from the feed already.
puts 'Importing'
feed.listings.each do |listing|
Listing.import(listing.to_hash)
end
end
end
end
のサンプルコードを追加するためには、私は、飼料中の<listings>
要素を気にしないでください。私はそれぞれの属性が欲しいだけです。<listing>
要素。
出力は次のようになります。
Parsing
... wait forever
Importing (actually, I don't ever see this on the big file (1.6gb) because too much memory is used :(
単純な答えあなたの質問に:コードの怠惰な、繊維ベースのバージョンを使用するには、私はあなたが、特にこのようなあなたのgemfileでgregweb'sバージョンを参照する必要があると思うはい、あなたが一望できているものがあります。残念ながら、あなたはそれが何であるか教えてくれませんでした。誰も目に見えないコードでメモリリークを見つけることはできません。 –
@MichaelKayサンプルを追加しました。ありがとう – jakeonrails