¿Cuál es la mejor manera de cargar listas grandes de JSON en Python?

Tengo acceso a un conjunto de archivos (alrededor de 80-800 mb cada uno). Desafortunadamente, solo hay una línea en cada archivo. La línea contiene exactamente un objeto JSON (una lista de listas). ¿Cuál es la mejor manera de cargarlo y analizarlo en objetos JSON más pequeños?

Ya hay un post similar aquí . Aquí está la solución que propusieron:

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) 

Si está intentando evitar cargar toda la lista en la memoria, puede procesar el archivo como texto primero:

Use una stack para mantener un registro de apertura y cierre de corchetes / citas. Escanee a través de la cadena para cualquiera de los abridores, o el actual más cercano. Al escanear un texto, busque solo el texto más cerca. Presione uno cuando lea el abridor, y sáquelo cuando encuentre el cerrador.

El conjunto completo para JSON es [ -> ] , { -> } y " -> " . Sin embargo, debe excluir \" . Puede consultar la especificación en http://www.json.org/

Luego, cuando se encuentra a ] y la stack solo tiene un elemento (el nivel superior [[‘)] después de marcar la coincidencia [ , entonces sabe que es hora de comenzar una nueva línea.

Finalmente, debe asegurarse de que el primer [ y último ] no aparezca en su salida.

Eso le dará objetos JSON separados para cada elemento de la lista, cada uno en una línea separada del archivo.

Si profundiza en la biblioteca JSON de python, debería haber algunas funciones que analicen JSON también. Puede aprovecharlos, aunque no formen parte de la interfaz pública.

Por supuesto, puede lograr lo mismo cargando la cadena utilizando la biblioteca JSON y luego volcándola elemento por elemento (o múltiples elementos) según la otra respuesta.

El módulo pandas 0.21.0 ahora es compatible con chunksize como parte de read_json . Puedes cargar y manipular un trozo a la vez:

 import pandas as pd chunks = pd.read_json(file, lines=True, chunksize = 100) for c in chunks: print(c)