Разбить огромный (95Mb) массив JSON на более мелкие куски? - PullRequest
7 голосов
/ 14 августа 2011

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

Попытка импортировать их на моем производствесервер, но у меня есть дешевый веб-сервер.Им не нравится, когда я ем все их ресурсы в течение 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)

dump:

pg_dump -U username -t table database > filename

restore:

psql -U username < filename

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

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


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

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

Ответы [ 4 ]

8 голосов
/ 14 августа 2011

В 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)
2 голосов
/ 18 ноября 2014

Я превратил работу Фихаг и Марка в крошечный скрипт (сущность)

, также скопированный ниже:

#!/usr/bin/env python 
# based on  /6385862/razbit-ogromnyi-95mb-massiv-json-na-bolee-melkie-kuski
# 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)
1 голос
/ 29 ноября 2017

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

Вы можете использовать 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))
1 голос
/ 14 августа 2011

Если у вас есть возможность вернуться и снова экспортировать данные ...:

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

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

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

...