一尘不染

将巨大的(95Mb)JSON数组拆分成较小的块?

python

我以JSON的形式从数据库中导出了一些数据,该数据本质上只是一个[列表],其中有一束(900K){objects}。

现在尝试将其导入生产服务器中,但是我有一些便宜的Web服务器。当我吃掉所有资源10分钟后,他们不喜欢它。

如何将该文件拆分为较小的块,以便可以逐段导入?

编辑:实际上,这是一个PostgreSQL数据库。我愿意就如何导出所有数据按块提出其他建议。我已经在服务器上安装了phpPgAdmin,该服务器据说可以接受CSV,Tabbed和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个您不关心的选项总是很痛苦的。

我最终还是接受了肯尼的建议…尽管那仍然是一个很大的痛苦。我不得不将表转储到文件中,进行压缩,上传,提取,然后尝试导入,但是数据在生产中略有不同,并且缺少一些外键(邮政编码附加在城市上)。当然,我不能只导入新的城市,因为那样会引发重复的键错误,而不是默默地忽略它,这会很好。因此,我必须清空该表,对城市重复该过程,才意识到其他与城市相关的事物,因此我也必须清空该表。回到城市,最后我可以输入邮政编码。到现在为止,我已经淘汰了一半的数据库,因为一切都与一切联系在一起,并且我不得不重新创建所有条目。可爱。好东西,我还没有 还没有启动该网站。同样,“清空”或截断表似乎并没有重置序列/自动增量,这是我想要的,因为有几个魔术条目我想拥有ID1。因此,我必须删除或重置那些(我也不知道如何),所以我手动将那些的PK修改为1。

我将在phihag的解决方案中遇到类似的问题,再加上一次必须导入一个17个文件,除非我编写了另一个导入脚本来匹配导出脚本。尽管他确实从字面上回答了我的问题,但还是谢谢。


阅读 297

收藏
2021-01-20

共1个答案

一尘不染

在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)
2021-01-20