我有一个巨大的 json 文件,其中包含来自数据库的 json 记录的数组数据。下面说一下
[
{"id":2,"name":"def","price":3.714714089426208},
{"id":3,"name":"ghi","price":27.0179624376119},
{"id":1,"name":"abc","price":52.51248221170203}
]
我想流式传输文件并一次处理一条记录。请告知这是如何完成的。
我试过下面的代码。但它会打印整个数组,我关心的是内存使用情况,我想一次处理一条记录,因此无需将整个数组加载到内存中。
class JsonStreamer
attr_accessor :parser
def initialize()
post_init
end
def post_init
@parser = Yajl::Parser.new(:symbolize_keys => true)
@parser.on_parse_complete = lambda {|obj|
puts obj
puts "-----------------------End of object --------------------------------"
}
end
def receive_data(data)
# continue passing chunks
@parser << data
end
def parse(f)
File.open(f, 'r') do |f|
f.each(100) {|chunk| receive_data (chunk)}
end
end
end
js = JsonStreamer.new()
js.parse('sample.json')