Ruby 为什么重复的JSON解析会消耗越来越多的内存?

Ruby 为什么重复的JSON解析会消耗越来越多的内存?,ruby,json,memory,memory-leaks,Ruby,Json,Memory,Memory Leaks,似乎在Ruby中反复解析同一个JSON文件会占用越来越多的内存。 考虑下面的代码和输出: 为什么第一次迭代后内存没有释放出来 为什么116MB JSON文件在解析后会占用1.5Gb的RAM?考虑到文本文件被转换成散列,这是令人惊讶的。我错过了什么 代码: 输出: before parsing: 116MB 1: 1840MB 2: 2995MB 3: 2341MB 4: 3017MB 5: 2539MB 6: 3019MB 当Ruby解析JSON文件时,它会创建许多中间对象来实现这一目标。在G

似乎在Ruby中反复解析同一个JSON文件会占用越来越多的内存。 考虑下面的代码和输出:

  • 为什么第一次迭代后内存没有释放出来
  • 为什么116MB JSON文件在解析后会占用1.5Gb的RAM?考虑到文本文件被转换成散列,这是令人惊讶的。我错过了什么
  • 代码:

    输出:

    before parsing: 116MB
    1: 1840MB
    2: 2995MB
    3: 2341MB
    4: 3017MB
    5: 2539MB
    6: 3019MB
    

    当Ruby解析JSON文件时,它会创建许多中间对象来实现这一目标。在GC开始工作之前,这些对象一直保留在内存中

    如果JSON文件具有复杂的结构、许多数组和内部对象,那么数量也会快速增长

    您是否尝试调用“GC.start”来建议Ruby清理未使用的内存?如果内存量 显著减少,这表明这只是用于解析数据的中间对象,否则,您的数据结构很复杂,或者您的数据中有一些lib无法释放的内容


    对于大型JSON处理,我使用yajl-ruby()。它是C实现的,占用空间小。

    垃圾回收器可以在它想运行的时候运行,这与您想让它运行的时候无关……当程序内存不足时,GC不应该运行吗?当json为400mb时,它在第一个iter上使用5Gig的ram,然后开始使用swap(这使得解析需要几十分钟而不是几秒钟)。我如何调用GC来清理内存?使用了哪些版本的Ruby和JSON?你是说“MB”而不是“MB”?在我的世界里,“MB”意味着兆字节,“MB”意味着兆字节,这有点不同。是的,我的意思是兆字节。更改为MB。我正在使用ruby 2.0.0-p0。不知道如何找到json版本。我似乎没有安装json gem,但代码仍然有效<代码>gem check json不会返回任何内容,我会这样做。但这并不能回答我的问题。@user1027996我编辑了这篇文章,并包含了一些信息。添加GC.start并不能说明问题difference@user1027996:JSON可能正在创建符号等,这可能会导致内存泄漏,因为它们从未被释放。我也知道,
    GC.start
    不会强制垃圾收集,但只有您向解释器建议,如果它在那里运行,您会很高兴。和+1表示
    yajl
    before parsing: 116MB
    1: 1840MB
    2: 2995MB
    3: 2341MB
    4: 3017MB
    5: 2539MB
    6: 3019MB