【问题标题】:Best way to parse a huge JSON file in ruby在 ruby​​ 中解析一个巨大的 JSON 文件的最佳方法
【发布时间】:2015-08-06 11:24:44
【问题描述】:

我很难解析一个巨大的 json 文件。

文件大于 1GB,我尝试使用两个 gem:ruby-stream 和 yajl,但它们都不起作用。

下面是一个例子。

fileStr = File.read("hugeJSONfile.json")

^这部分没问题。

但是,当我尝试将 fileStr 加载到 JSON 哈希中(通过 ruby​​-stream 或 yajl)时,我的计算机死机了。

关于如何更有效地做到这一点的任何其他想法?谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby json parsing


    【解决方案1】:

    看看json-streamyajl

    文档中的关键引用:

    json 流:

    文档本身永远不会完全读入内存。

    亚吉尔:

    这个库的主要好处在于它的内存使用。由于它能够以块的形式解析流,因此它的内存需求非常非常低。

    您注册要查找的事件,它会在读取 JSON 时返回键/值,而不是将其全部加载到 ruby​​ 数据结构中(并因此加载到内存中)。

    【讨论】:

    • 我不确定你是否阅读了我的整个帖子,但这两块宝石都冻结了我的电脑。
    • 我的直觉是我的 JSON 文件对于那些 gem 来说太复杂了。例如,如果我有类似 [ {...[...{...}]}] 的东西,其中每个“...”都超长,那么宝石可能会流式传输,直到它试图平衡括号组合,这可能需要一段时间。请注意,我没有研究这些 gem 如何优化流式传输过程,这完全是一种预感。
    • 在这些解析器运行时,您是否正在查看您的内存使用情况?我很好奇这个程序运行了多长时间,你才决定它被冻结了?
    • 这很难,因为我的 comp 上的其他应用程序开始严重滞后......你知道,这可能只是因为我在 2010 年开始在恶化的 Mac 上运行 - 尽管我的朋友运行较新的笔记本电脑的相同脚本遇到了类似的问题。在我决定重新启动计算机之前,我多次让程序运行超过 40 分钟。
    【解决方案2】:

    好的,我能够解析它。

    老实说,这不是最优雅的解决方案,但在绝望的时候,解析巨大 JSON 文件的一种快速方法是手动检查文件,注意模式,然后挑选出你需要的东西。

    就我而言,这是我在伪代码中所做的

    fileStr = File.read("hugeJSONfile.json")
    arr = fileStr.split("[some pattern]")
    arr.each do |str|
        extract desired value from str
    end
    

    同样,这不是最优雅的解决方案,但它的维护成本低,并且根据给定的情况,只需适应你的蹩脚笔记本电脑所能承受的。

    【讨论】:

    • 如果您不想实现自定义解析器,这是一个不错但脆弱的方法。你能分享你正在使用的正则表达式吗?我正在尝试使用以下正则表达式代码解析哈希数组:json[1..-1].split(/,(?={)/) 但是哈希内部可以包含哈希数组,因此正则表达式无法正常工作。关于如何使这个正则表达式更健壮的任何建议?
    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多