Разделить огромный (95Mb) массив JSON на более мелкие куски?

Я экспортировал некоторые данные из моей базы данных в виде JSON, который по существу является только одним [списком] с пучком (900K) {объектов} внутри него.

Попытка импортировать его на моем производственном сервере сейчас, но у меня есть дешевый веб-сервер. Им это не нравится, когда я ем все свои ресурсы в течение 10 минут.

Как я могу разделить этот файл на более мелкие куски, чтобы я мог импортировать его по частям?


Изменить: На самом деле это firebase database 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 

(Я не знаю, что делает heck pg_restore, но это дает мне ошибки)

Учебники по этому поводу оставляют эту информацию, особенно. вариант -U который, вероятно, необходим в большинстве случаев. Да, справочные страницы объясняют это, но всегда больно просеивать 50 вариантов, которые вам не нужны.


Я закончил с предложением Кенни … хотя это все еще было большой болью. Мне пришлось сбрасывать таблицу в файл, сжимать ее, загружать, извлекать, а затем пытаться импортировать, но данные были немного различны при производстве, и некоторые отсутствующие foreign keys (почтовые индексы привязаны к городам). Конечно, я не мог просто импортировать новые города, потому что тогда он выбрасывает двойную ключевую ошибку вместо того, чтобы молча игнорировать ее, что было бы неплохо. Поэтому я должен был опорожнить этот стол, повторить процесс для городов, только чтобы понять, что что-то еще привязано к городам, поэтому я тоже должен был очистить этот стол. Получил города назад, тогда, наконец, я мог импортировать мои почтовые индексы. К настоящему времени я уничтожил половину моей базы данных, потому что все привязано ко всему, и мне пришлось воссоздать все записи. Прекрасный. Хорошо, что я еще не запустил сайт. Кроме того, «опустошение» или усечение таблицы не похоже на сброс последовательностей / автоинкрементов, которые мне бы хотелось, потому что есть пара магических записей, которые я хочу иметь ID 1. Так что .. Мне нужно удалить или перезагрузить (я не знаю, как), поэтому я вручную отредактировал ПК для тех, кто вернулся к 1.

Я бы столкнулся с аналогичными проблемами с решением phihag, плюс мне пришлось бы импортировать по 17 файлов по одному, если только я не написал еще один сценарий импорта, соответствующий сценарию экспорта. Хотя он действительно отвечал на мой вопрос буквально, так что спасибо.

Предполагая, что у вас есть возможность вернуться и экспортировать данные снова …:

pg_dump – извлечь базу данных PostgreSQL в файл сценария или другой файл архива.

pg_restore – восстановить базу данных PostgreSQL из архивного файла, созданного pg_dump.

Если это бесполезно, может быть полезно узнать, что вы собираетесь делать с выходом, чтобы другое предложение могло поразиться.

В 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) 

Я знаю, что это вопрос с того времени, но я думаю, что это новое решение без проблем.

Вы можете использовать pandas 0.21.0 который поддерживает параметр chunksize как часть 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))