【问题标题】:Processing huge json-array files with jq用 jq 处理巨大的 json-array 文件
【发布时间】:2015-08-24 12:15:15
【问题描述】:

我有相对较小的对象的巨大 (~7GB) json 数组。

有没有相对简单的方法来过滤这些对象而不将整个文件加载到内存中?

--stream 选项看起来很合适,但我不知道如何将 [path,value] 的流折叠到原始对象。

【问题讨论】:

  • 小世界。我刚刚遇到了类似的问题。出于兴趣,您的 json 文件中的空格是可预测的吗?例如,大型 json 数组通常每个顶级数组项使用一行?
  • 如果文件已经定期格式化,那么您可能需要考虑使用文本整理工具将文件转换为小对象流,然后可以使用 jq 进行处理。如果文件尚未适当格式化,那么如果只对整个文件使用一次 jq 是可以接受的,那么您可以考虑使用 jq . 格式化 JSON 以便于转换成这样的流。

标签: json jq


【解决方案1】:

jq 1.5 有一个流解析器。 jq FAQ 给出了如何将顶级 JSON 对象数组转换为其元素流的示例:

$ jq -nc --stream 'fromstream(1|truncate_stream(inputs))'
[{"foo":"bar"},{"foo":"baz"}]
{"foo":"bar"}
{"foo":"baz"}

这对于您的目的可能已经足够了,但值得注意的是 setpath/2 可能会有所帮助。以下是制作传单流的方法:

jq -c --stream '. as $in | select(length == 2) | {}|setpath($in[0]; $in[1])'

jq 手册中提供了更多信息和文档: https://stedolan.github.io/jq/manual/#Streaming

【讨论】:

  • --stream 选项看起来很有希望,但我仍然不确定如何使用它。例如,流式解析器如何在末尾检测到缺少的右括号?
  • 谢谢,看来这是解决我的问题的预期方式。不幸的是,看起来 jq 有一个 bug 阻止我使用它。我最终编写了自己的小型 json 解析器来完成同样的工作。我还发现我的简单 python 脚本可以比 jq 更快地搜索有趣的条目(可能是我不正确地使用了 jq)。所以我对这个工具很失望:(
  • @dim-an - 我对使用输入时必须使用 -n 表示不满。 --stream 选项是新的,所以我并不惊讶它相当慢。正如我在本页其他地方提到的那样,如果我处于你的位置(事实上我一直是),我可能会简单地剪掉第一个和最后一个括号,或者专注于弄清楚如何使用 jq 一次来解决你的巨大问题-object JSON 转换成更易于管理的形式。
  • ... 或者像我建议的那样以正确的方式去做! ;)
  • 我需要在大约 7GB 大小的 json 上执行 group_by(col),并且 col 包含大约 3m 个不同的值。最好的方法是什么?
猜你喜欢
  • 2017-09-14
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2013-09-28
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
相关资源
最近更新 更多