将巨大的(95Mb) JSON数组分割成更小的块



我以JSON的形式从数据库导出了一些数据,这实际上只是一个[列表],其中包含一堆(900K){对象}。

尝试导入到我的生产服务器上,但我有一些便宜的web服务器。他们不喜欢我在10分钟内吃掉他们所有的资源。

我如何将这个文件分割成更小的块,以便我可以一块一块地导入它?


Edit:实际上,这是一个PostgreSQL数据库。我愿意听取其他关于如何导出所有数据块的建议。我已经在我的服务器上安装了phpPgAdmin,据说可以接受CSV,选项卡和XML格式。


我必须修复phihag的脚本:

import json
with open('fixtures/PostalCodes.json','r') as infile:
  o = json.load(infile)
  chunkSize = 50000
  for i in xrange(0, len(o), chunkSize):
    with open('fixtures/postalcodes_' + ('%02d' % (i//chunkSize)) + '.json','w') as outfile:
      json.dump(o[i:i+chunkSize], outfile)

转储:

pg_dump -U username -t table database > filename

恢复:

psql -U username < filename

(我不知道pg_restore到底做了什么,但它给了我错误)

这方面的教程方便地省略了这些信息,特别是在大多数情况下可能需要的-U选项。是的,手册页解释了这一点,但是从50个你不关心的选项中筛选总是很痛苦的。


我最后还是接受了肯尼的建议。尽管这仍然是一个很大的痛苦。我不得不将表转储到一个文件中,压缩它,上传它,提取它,然后我试图导入它,但是生产中的数据略有不同,并且缺少一些外键(postalcodes附加到城市)。当然,我不能只是导入新的城市,因为那样它会抛出一个重复的键错误,而不是默默地忽略它,这本来是很好的。所以我必须清空那个表,对城市重复这个过程,才发现还有别的东西与城市相关联,所以我也必须清空那个表。重新输入城市,然后我终于可以输入我的邮政编码了。到目前为止,我已经删除了一半的数据库,因为所有内容都与其他内容绑定在一起,我必须重新创建所有条目。可爱。还好我还没开通这个网站。此外,"清空"或截断表似乎不会重置序列/自动增量,这是我想要的,因为有一对我想要ID为1的神奇条目。所以. .我也不得不删除或重置这些(我不知道怎么做),所以我手动编辑那些PKs回到1。 如果使用phihag的解决方案,我可能会遇到类似的问题,而且我必须一次导入17个文件,除非我编写另一个导入脚本来匹配导出脚本。不过他确实按字面意思回答了我的问题,所以谢谢。

Python:

import json
with open('file.json') as infile:
  o = json.load(infile)
  chunkSize = 1000
  for i in xrange(0, len(o), chunkSize):
    with open('file_' + str(i//chunkSize) + '.json', 'w') as outfile:
      json.dump(o[i:i+chunkSize], outfile)

我把phihag和mark的工作变成了一个小脚本(gist)

也复制如下:

#!/usr/bin/env python 
# based on  http://stackoverflow.com/questions/7052947/split-95mb-json-array-into-smaller-chunks
# usage: python json-split filename.json
# produces multiple filename_0.json of 1.49 MB size
import json
import sys
with open(sys.argv[1],'r') as infile:
    o = json.load(infile)
    chunkSize = 4550
    for i in xrange(0, len(o), chunkSize):
        with open(sys.argv[1] + '_' + str(i//chunkSize) + '.json', 'w') as outfile:
            json.dump(o[i:i+chunkSize], outfile)

假设您可以返回并再次导出数据…:

pg_dump -将PostgreSQL数据库解压为脚本文件或其他归档文件。

pg_restore -从pg_dump创建的归档文件中恢复PostgreSQL数据库。

如果这没有用,那么知道如何处理输出可能是有用的,以便其他建议可以达到目的。

我知道这个问题是从一段时间以前,但我认为这个新的解决方案是没有麻烦的。

您可以使用支持块大小参数的pandas 0.21.0作为read_json的一部分。你可以一次加载一个块并保存json:

import pandas as pd
chunks = pd.read_json('file.json', lines=True, chunksize = 20)
for i, c in enumerate(chunks):
    c.to_json('chunk_{}.json'.format(i))

最新更新