MemoryError utilizando json.dumps ()

Me gustaría saber cuál de json.dump() o json.dumps() es el más eficiente cuando se trata de codificar una matriz grande en formato json.

¿Me puede mostrar un ejemplo del uso de json.dump() ?

En realidad, estoy haciendo un CGI de Python que obtiene una gran cantidad de datos de una base de datos MySQL usando el ORM SQlAlchemy, y después de que un usuario activó el procesamiento, almaceno la salida final en un Array que finalmente convierto a Json.

Pero cuando se convierte a JSON con:

  print json.dumps({'success': True, 'data': data}) #data is my array 

Obtuve el siguiente error:

 Traceback (most recent call last): File "C:/script/cgi/translate_parameters.py", line 617, in <module> f.write(json.dumps(mytab,default=dthandler,indent=4)) File "C:\Python27\lib\json\__init__.py", line 250, in dumps sort_keys=sort_keys, **kw).encode(obj) File "C:\Python27\lib\json\encoder.py", line 209, in encode chunks = list(chunks) MemoryError 

Por lo tanto, mi conjetura es usar json.dump() para convertir datos por trozos. ¿Alguna idea sobre cómo hacer esto?

¿O otras ideas además de usar json.dump() ?

Simplemente puede reemplazar

 f.write(json.dumps(mytab,default=dthandler,indent=4)) 

por

 json.dump(mytab, f, default=dthandler, indent=4) 

Esto debería “transmitir” los datos al archivo.

El módulo JSON asignará toda la cadena JSON en la memoria antes de escribir, por lo que se produce MemoryError .

Para solucionar este problema, use JSON.Encoder().iterencode() :

 with open(filepath, 'w') as f: for chunk in json.JSONEncoder().iterencode(object_to_encode): f.write(chunk) 

Sin embargo, tenga en cuenta que esto generalmente tomará bastante tiempo, ya que se escribe en muchos trozos pequeños y no todo a la vez.


Caso especial:

Tuve un objeto Python que es una lista de dictados. Como tal:

 [ { "prop": 1, "attr": 2 }, { "prop": 3, "attr": 4 } # ... ] 

Podría JSON.dumps() objetos individuales, pero la lista completa de volcado genera un MemoryError Para acelerar la escritura, abrí el archivo y escribí el delimitador JSON manualmente:

 with open(filepath, 'w') as f: f.write('[') for obj in list_of_dicts[:-1]: json.dump(obj, f) f.write(',') json.dump(list_of_dicts[-1], f) f.write(']') 

Probablemente pueda salirse con la suya si conoce su estructura de objetos JSON de antemano. Para un uso general, solo use JSON.Encoder().iterencode() .