我在Ruby中处理一个巨大的JSON文件时遇到了麻烦.我正在寻找的是一种逐个处理它的方法,而不会在内存中保留太多数据.
我认为yajl-ruby gem会做这项工作,但它会消耗我所有的记忆.我也看过Yajl :: FFI和JSON:流宝石,但有明确说明:
对于较大的文档,我们可以使用IO对象将其流式传输到解析器中.我们仍然需要解析对象的空间,但文档本身永远不会完全读入内存.
这是我用Yajl做的事情:
file_stream = File.open(file, "r")
json = Yajl::Parser.parse(file_stream)
json.each do |entry|
entry.do_something
end
file_stream.close
Run Code Online (Sandbox Code Playgroud)
内存使用量持续增加,直到进程被终止.
我不明白为什么Yajl会在内存中保留已处理的条目.我可以以某种方式释放它们,还是我误解了Yajl解析器的功能?
如果无法使用Yajl完成:有没有办法在Ruby中通过任何库?
我有一个包含JSON哈希的大文件(> 50Mb).就像是:
{
"obj1": {
"key1": "val1",
"key2": "val2"
},
"obj2": {
"key1": "val1",
"key2": "val2"
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想解析散列中的每个项目,而不是解析整个文件并说出前十个元素.我实际上并不关心关键,即obj1.
如果我将上面的内容转换为:
{
"key1": "val1",
"key2": "val2"
}
"obj2": {
"key1": "val1",
"key2": "val2"
}
Run Code Online (Sandbox Code Playgroud)
我可以使用Yajl流轻松实现我想要的东西:
io = File.open(path_to_file)
count = 10
Yajl::Parser.parse(io) do |obj|
puts "Parsed: #{obj}"
count -= 1
break if count == 0
end
io.close
Run Code Online (Sandbox Code Playgroud)
有没有办法在不必更改文件的情况下执行此操作?也许在Yajl中有某种回调?