gpt4 book ai didi

json - 分离处理非常大的压缩 JSON 文件的命令的保存输出

转载 作者:太空狗 更新时间:2023-10-29 11:28:25 28 4
gpt4 key购买 nike

好的,让我们从我正在使用的命令行开始:

curl --silent http://example.com/json.gz | pigz -dc | jq -r '[.name, .value] | @csv' > data.csv

CURL 将下载 11.6 GB 的压缩 JSON 文件,pigz 将解压缩并将所有处理后的输出写入标准输出,jq 将读取 JSON 并将输出保存为csv 文件。

问题是,保存为 data.csv 的输出非常大,毕竟我仍然需要使用 PHP 脚本分析这些数据,并以特殊格式将其插入 MYSQL(数据将非常小) )

但是,我的服务器中只剩下不到 60 GB 的可用空间,即使我无法解压缩完整数据并将其保存到 CSV 文件。

所以,我想到了一个主意,如果我能够将输出保存到具有不同名称的单独文件(假设名称是当前日期或时间戳),那么我就可以运行 PHP 脚本来处理每个 .csv它们的文件并将数据保存到数据库,然后删除文件以释放空间,不确定这是否是最好的方法,但至少我正在努力使其工作。

因此,我将命令行修改为:

curl --silent http://example.com/json.gz | pigz -dc | jq -r '[.name, .value] | @csv' > `date +"%S-%M-%d-%m-%Y"`_data.csv

但是,它只将所有内容保存在一个文件中,我认为它将保存为多个文件,每个文件都有不同的名称,因为在写入输出时日期会不断变化。

此外,欢迎任何其他可行的解决方案,谢谢!

最佳答案

使用 GNU split --filter 节省空间

POSIX split 从其输入创建输出文件,因此需要大量可用空间来存储它们(整个未压缩输入的大小加上一些开销)。

但是,split 的 GNU 版本有一个额外的 --filter 选项,允许在更少的空间中处理单个数据 block ,因为它不需要创建任何临时文件:

| split -l $NUMLINES --filter='shell_command'

你可以把它想象成 xargs -n $NUMLINES command 除了将数据传递给 stdin 而不是作为命令行参数。

例如输出/etc/passwd每组(最多)7行的md5sum,然后输出处理的 block 数:

</etc/passwd split -l7 --filter='md5sum|tee /dev/tty' |\
{ echo Processed $(wc -l) chunks; }

要修改您的命令一次处理 10000 行,您可以这样做:

curl -L --silent "$URL" |\
pigz -dc |\
jq -r '[.name, .value] | @csv' |\
split -l 10000 --filter='save2db.php'

您的过滤器命令 save2db.php 应该从标准输入中读取。

如果你更喜欢让它从实际文件中读取,你可以这样做:

... |\
split -l 10000 --filter='cat >TMPFILE; save2db.php TMPFILE';
rm TMPFILE

警告:您需要确保在行边界上拆分 csv 文件是安全的。一些 csv 文件包含带有嵌入式文字换行符的字段;如果中场 split ,他们可能会变得畸形。

关于json - 分离处理非常大的压缩 JSON 文件的命令的保存输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55192047/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com