linux 在大json文件(50GB)上使用jq

yc0p9oo0  于 2023-01-16  发布在  Linux
关注(0)|答案(3)|浏览(236)

我想在一个50 GB的文件上使用jq。不用说,机器的内存无法处理它。它的内存快用完了。
我尝试了几个选项,包括--stream,但是没有用。有人能告诉我我做错了什么吗?以及如何修复它

jq -cn --stream 'fromstream(1|truncate_stream(inputs))' file.json |   jq -cr .data[] >> out.json

该文件包含如下数据:

{"data":[{"id":"id1","value":"value1"},{"id":"id2","value":"value2"},{"id":"id3","value":"value3"}...]}

我想读取数据字段中数组的每个值并将其逐行放入另一个文件中.如下面所示

{"id":"id1","value":"value1"}
{"id":"id2","value":"value2"}
{"id":"id3","value":"value3"}

现在,该命令内存不足并被删除。

mhd8tkvw

mhd8tkvw1#

假设您的大文件包含大量关于json对象的内容,您可以逐个处理它们并提取字段.data[]
这样,内存消耗受输入中最大json大小的限制,而不是受所有json输入大小之和的限制。
或者您的问题是 * 单个 * json对象太大,以至于内存不足?

echo '
{ "key":"A1", "property":"A2", "data":[1,2,3] }{"key":"B1","property":"B2","data":[4,5,6]}
{ 
   "key":"C1", 
   "property":"C2", 
   "data":[7,8,9] 
}' | jq -cr '.data[]'

结果

1
2
3
4
5
6
7
8
9
rvpgvaaj

rvpgvaaj2#

对于您的示例,以下内容就足够了:

jq -cn --stream 'fromstream( inputs|(.[0] |= .[2:]) | select(. != [[]]) )'

如果您只想逐项列出.data数组,请将上面的inputs替换为:

inputs|select(first|first=="data")

需要说明的是,您也可以以完全相同的方式使用gojq(jq的Go实现)。

n3ipq98p

n3ipq98p3#

还有什么工具可以完成这项工作?
jm是我为“JSON Machine”编写的一个命令行 Package 器,它非常容易使用,而且通常比jq的流解析器更经济。

jm —-pointer '/data'

或者类似地,在同一个存储库中使用基于Python的脚本:

jm.py -i data.item file.json

假设只有一个顶级键,则在此特定情况下的另一种选择是:

jstream -d 2 <  file.json

相关问题