相关疑难解决方法(0)

如何在不消耗所有内存的情况下将巨大的JSON文件作为Ruby中的流处理?

我在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中通过任何库?

ruby memory parsing json yajl

9
推荐指数
2
解决办法
4789
查看次数

使用ruby-yajl解析大型JSON哈希?

我有一个包含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中有某种回调?

ruby yajl

6
推荐指数
2
解决办法
2308
查看次数

标签 统计

ruby ×2

yajl ×2

json ×1

memory ×1

parsing ×1