我需要将非常大的JSON文件(20GB)拆分为多个较小的JSON文件(假设阈值为100 MB)。
示例文件布局如下所示。
file.json
[{"name":"Joe", "Place":"Denver", "phone_number":["980283", "980284", "980285"]},{"name":"kruger", "Place":"boston",
"phone_number":["980281", "980282", "980283"]},{"name":"Dan", "Place":"Texas","phone_number":["980286", "980287", "980286"]}, {"name":"Kyle", "Place":"Newyork", "phone_number":["980282", "980288", "980289"]}]
输出应如下所示
文件1:
[{"name":"Joe", "Place":"Denver", "phone_number":["980283", "980284", "980285"]}, {"name":"kruger", "Place":"boston", "phone_number":["980281", "980282", "980283"]}]
文件2:
[{"name":"Dan", "Place":"Texas","phone_number":["980286", "980287", "980286"]}, {"name":"Kyle", "Place":"Newyork", "phone_number":["980282", "980288", "980289"]}]
我可以知道最好的实现方法吗?我应该选择shell命令还是python?
2条答案
按热度按时间wrrgggsh1#
Python模块
json-stream
可以做到这一点,但有一些注意事项,我将在后面介绍。您必须实现访问者模式。
每个完整的JSON类型都会调用这个
visitor
函数,可以说深度优先,所以每个完整的JSON元素(数字、字符串、数组)都会调用这个回调函数,由你决定在哪里暂停处理并写出部分文件。需要注意的是,如果您的输入文件是一个完整的单一元素(如一个字典),则必须将输出格式更改为其他格式,因为它不能跨文件拆分。
{ "top" : [1,2,3] }
分成两个独立的文件。
jpfvwuh42#
只要文件的结构是每行1个条目,并且主列表中没有子列表条目,你就可以用
sed
进行基本的字符串替换,这很脆弱,但是相对较快,内存效率也很高,因为sed
是为流文本设计的。以下是就地修改“file.json”的示例:
然后,可以使用基本的bash循环(使用
read
)将每一行写入单独的文件。要计算输入文件而不修改它并写入目标文件,您可以执行以下操作:
对于示例文件,它将创建两个文件:
file1
和file2