我有一个1.6GB的XML文件,使用Sax Machine解析时似乎没有以流式或分块方式进行 - 而是似乎将整个文件加载到内存中(或者可能存在内存泄漏问题?),因为我的Ruby进程的RAM超过了2.5GB。我不知道它何时停止增长,因为我已经用完了内存。
在较小的文件(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 :(