gpt4 book ai didi

python - 使用 bash 或 python 对巨大的 JSON 文件进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:28 25 4
gpt4 key购买 nike

要求:我有一个 .gz 格式的 Json 文件。因此,当它被压缩时,它的大小约为 500 MB。当我提取它时,json 文件几乎变成了 ~10 GB。提取的 JSON 文件逐行包含各个 JSON 对象。我想要的是使用任何 bash 脚本或 python 程序根据字段 ps 对文件进行排序。

由于文件太大,不建议加载到内存中。因此,我使用 gzcat 和 cat bash 命令来流式传输 JSON 数据,然后将它们通过管道传输到 jq 以进行排序。但是要么系统在此过程中没有响应,要么我在 output.json 中得到空文件

>cat  sth2.json | parallel --pipe --group --block 1000M --recend '\n}\n' "jq -s -c 'sort_by(.ps) | .[]'"  > "output.json"
>gzcat sth2.json.gz | parallel --pipe --group --block 1000M --recend '\n}\n' "jq -s -c 'sort_by(.ps) | .[]'" > "output.json"

硬件:16GB 内存,酷睿i5处理器

示例 JSON 数据:-

{
"ps":"abc"
....
}
{
"ps":"def"
......
}
{
"ps":"abc"
....
}

预期输出:

{
"ps":"abc"
....
}
{
"ps":"abc"
....
}
{
"ps":"def"
....
}

我不明白我做错了什么。谁能建议如何对如此巨大的 JSON 文件进行排序?我关注的链接: https://github.com/joelpurra/jq-hopkok/tree/master/src/parallelism

此外,有什么方法可以在没有 Hadoop 的情况下通过任何 Map reduce 来完成?

方法 1:将数据流式传输到本地 Sqlite 数据库。

import sqlite3
import fileinput

PATH=".../sqlite-snapshot-201904101324/testDB.db"
insert_query="INSERT INTO feeds (data) VALUES (?)"

def db_connect(db_path=PATH):
con = sqlite3.connect(db_path)
return con

con = db_connect() # connect to the database
cur = con.cursor() # instantiate a cursor obj

record_count = 0
for line in fileinput.input():
cur.execute(insert_query,(line,))

命令行:

>gzcat sth.json.gz | python insert.py

最佳答案

这是一个基于评论之一的建议的解决方案:

If you can e.g. prefix the lines with the sort key so that they can be sorted as text rather than JSON, then GNU sort can easily sort 10GB+ files without loading them into memory. – that other guy

您可以使用 jq 按照以下行执行此操作:

jq -cr '"\(.ps)\t\(.)"' 

这将生成具有制表符分隔值的行,如下所示:

abc {"ps":"abc","x":0}
abc {"ps":"abc","x":1}

使用 -c 选项可确保将每一对(即排序键和对象)写入一行。

现在您可以轻松地对行进行排序,例如使用排序;然后使用例如cut 去除 .ps 字段。

最后,如果你真的想要格式化输出,你可以再次使用 jq(例如 jq .),关键是 jq 默认是流-导向。

警告

以上假定 .ps 值是无制表符的。如果不是这种情况,那么您可以使用不同的字段分隔符,或者:

jq -cr '([.ps] | @tsv) + "\t" + tostring'

关于python - 使用 bash 或 python 对巨大的 JSON 文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55712633/

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