每个月我都会收到非常大和复杂的json文件。文件通常为1- 50 GB,有时大于150 GB。文件被加载到awsemr配置单元表中,然后使用配置单元json函数进行处理。当该进程试图加载包含长度大于2GB的行的json文件时,该进程将失败。
我试着用jq(jq -c。json< source.json >)来压缩和格式化文件。这适用于较小的测试文件,但不能扩展。我尝试了jq的stream函数,但是在重建结构时,进程会占用内存。
我正在寻找一种方法来重新格式化一个json文件,它的行长度超过2GB,不需要将整个文件加载到内存中。
这可以用jq实现吗?
[50GB测试文件](https://webtpa-public-access.s3.us-west-2.amazonaws.com/subfolder/2023_06_430_65B0_in_network_rates.json.gz)
1条答案
按热度按时间0md85ypi1#
我的理解是JSON只能在双引号字符串中包含转义双引号。这让我相信在
"
key":"
value"
的内容后面追加换行符是安全的。如果你可以选择一个足够频繁出现的键/值对,那么你可以使用gawk来插入换行符。
举一个“标准”的例子,它似乎经常出现在你的测试文件中:
在每次出现该正则表达式后插入一个换行符。
gawk read一次读取一个记录,由
RS
中的regex分隔,并将ORS
设置为实际字符串(RT
),后跟换行符。由于ORS
赋值结果总是“真值”,因此会发生默认的打印操作。内存使用量将是正则表达式出现之间的最大长度的某个小倍数。
对于提供的测试文件,我5年前的笔记本电脑花了半个小时运行
zcat | gawk | wc -l
,而我正在使用机器做其他事情,需要小于44 MB的虚拟内存,是CPU绑定的,最后报告了333443行。zcat | wc -c
花了5分钟。