2012-05-23 17 views
8

Tengo un archivo JSON de 1,7 GB cuando intento abrir con json.load(), entonces está dando error de memoria, ¿Cómo puedo leer el archivo json en python?Apertura de un archivo JSON grande en Python

Mi archivo JSON es una gran variedad de objetos que contienen claves específicas.

EDITAR: Bueno, si se trata de una gran variedad de objetos y se conoce la estructura de los objetos de antemano, entonces no hay necesidad de utilizar herramientas, podríamos leerlo línea por línea. Una línea solo contendrá un elemento de la matriz. Me di cuenta de que es la forma en archivos JSON se almacenan, para mí funcionó tan solo

>>>for line in open('file.json','r').readline(): 
... do something with(line) 
+1

¿Por qué tiene un archivo JSON tan grande? Un formato que casi siempre se lee en la memoria como un todo es bastante inadecuado para grandes estructuras como esta. Considere almacenar sus datos en una base de datos. – ThiefMaster

+0

¿Qué intentas hacer con los datos? ¿De dónde viene? –

+0

Probablemente debería almacenarlos en diferentes archivos pero no hice eso :(, quiero usar esos datos para el análisis de sentimientos. –

Respuesta

10

¿Quieres un analizador JSON incrementales como yajl y uno de sus enlaces de Python. Un analizador incremental lee lo menos posible de la entrada e invoca una devolución de llamada cuando se decodifica algo significativo. Por ejemplo, para extraer sólo los números de un gran archivo JSON:

class ContentHandler(YajlContentHandler): 
    def yajl_number(self, ctx, val): 
     list_of_numbers.append(float(val)) 

parser = YajlParser(ContentHandler()) 
parser.parse(some_file) 

Ver http://pykler.github.com/yajl-py/ para obtener más información.

+0

¿Mi archivo json es una gran variedad de objetos que me ayuda a analizar? –

+1

@HirakSarkar: sí. Deberá definir devoluciones de llamada apropiadas en su clase ContentHandler. – georg

+0

Tengo un problema con el cable incluso después de instalar yajl mediante easy_install en el shell de Python, está dando el error de que el módulo yajl no está allí. Que debería hacer. Mi versión de Python es 2.6 –

1

He encontrado otra envoltura de Python alrededor de yajl biblioteca, que es ijson.

Funciona mejor para mí que yajl-py debido a las siguientes razones:

  • yajl-py no detectó biblioteca yajl en mi sistema, he tenido que cortar el código con el fin de hacer que funcione
  • ijson código es más compacto y más fácil de usar
  • ijson puede trabajar tanto con yajl v1 y v2 yajl, y que incluso tiene pura pitón de reemplazo yajl
  • ijson tiene muy buena ObjectBuilder, lo que ayuda a extraer n ot sólo eventos pero significativo sub-objetos de flujo analizado, y en el plano que especifique
0

encontré yajl (de ahí ijson) a ser mucho más lento que el módulo de json cuando se accede a un archivo de datos grande desde un disco local. Aquí es un módulo que asegura un mejor desempeño que yajl/ijson (aún más lento que json), cuando se utiliza con Cython:

http://pietrobattiston.it/jsaone

Como señala el autor, el rendimiento puede ser mejor que json cuando el archivo es recibido a través de la red ya que un analizador incremental puede comenzar a analizar más rápido.

Cuestiones relacionadas