【发布时间】:2020-10-01 11:18:43
【问题描述】:
我必须在 Ubuntu 18 上将 ~1000 个大型 json 文件 (1M .. 500M) 合并为一个文件 (~80GB)。 根据this SO question,我使用 jq 和
jq -s 'reduce .[] as $item ({}; . * $item)' ~/ml/train-*.json > train.json
这对于较小的文件非常有效。
发生合并的机器是一个 32 核的服务器,具有 128 GB 的 RAM。唉,任务以a结束
Killed
语句,但就内存而言,资源应该是足够的。有人可以给我一些建议如何管理这项任务吗?谢谢
【问题讨论】:
-
你可以调用
jq的流解析器来避免内存中的存储,但不要认为jq具有多处理能力来利用多核。一种方法是使用 jq 中的命令 - Cookbook - github.com/stedolan/jq/wiki/Cookbook#processing-huge-json-texts -
尝试
jq -cn --stream ' def atomize(s): fromstream(foreach s as $in ( {previous:null, emit: null}; if ($in | length == 2) and ($in|.[0][0]) != .previous and .previous != null then {emit: [[.previous]], previous: $in|.[0][0]} else { previous: ($in|.[0][0]), emit: null} end; (.emit // empty), $in) ) ; atomize(inputs)' ~/ml/train-*.json,如果生成的文件太大而无法存储在磁盘上,请将输出通过管道传输到gzip以进行压缩,即jq .. | gzip > result.gz,然后使用zcat解析压缩后的文件文件
标签: json linux merge jq large-files