Python: ¿Cómo escribo una lista en un archivo y luego la devuelvo a la memoria (dict representado como una cadena convertida a dict) más tarde?

Dupe más específico de 875228: almacenamiento de datos simple en Python .

Tengo un dict bastante grande (6 GB) y necesito procesarlo. Estoy probando varios métodos de agrupación de documentos, así que necesito tener todo en memoria al mismo tiempo. Tengo otras funciones para ejecutar en estos datos, pero los contenidos no cambiarán.

Actualmente, cada vez que pienso en nuevas funciones tengo que escribirlas y luego volver a generar el dict. Estoy buscando una manera de escribir este dictado en un archivo, de modo que pueda cargarlo en la memoria en lugar de recalcular todos sus valores.

para simplificar demasiado las cosas, se parece a: {(((” word ‘,’ list ‘), (1,2), (1,3)), (…)): 0.0, ….}

Siento que Python debe tener una mejor manera que yo en busca de una cadena que busca: y (tratando de analizarlo en un diccionario).

¿Por qué no usar pepinillo python ? Python tiene un gran módulo de serialización llamado pickle que es muy fácil de usar.

import cPickle cPickle.dump(obj, open('save.p', 'wb')) obj = cPickle.load(open('save.p', 'rb')) 

Hay dos desventajas con pickle:

  • No es seguro contra datos erróneos o malintencionados. Nunca descomprima los datos recibidos de una fuente no confiable o no autenticada.
  • El formato no es legible por humanos.

Si está utilizando Python 2.6, hay un módulo incorporado llamado json . Es tan fácil de usar como un pepinillo:

 import json encoded = json.dumps(obj) obj = json.loads(encoded) 

El formato Json es legible para los humanos y es muy similar a la representación de la cadena del diccionario en python. Y no tiene ningún problema de seguridad como el pepinillo. Pero podría ser más lento que cPickle.

yaml , json , yaml , o lo que sea, como lo sugieren otras respuestas.

shelve es especialmente bueno porque puede tener el dict en el disco y seguir utilizándolo. Los valores serán cargados a pedido.

Pero si realmente desea analizar el texto del dict , y solo contiene cadenas, int sy la tuple que ha mostrado, puede usar ast.literal_eval para analizarlo. Es mucho más seguro, ya que no se pueden evaluar expresiones completas con él. Solo funciona con cadenas, números, tuple , list , dict s, booleans y None :

 >>> import ast >>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}") {12: 'mydict', 14: (1, 2, 3)} 

Le sugiero que use YAML para su formato de archivo, de modo que pueda modificarlo en el disco.

 How does it look: - It is indent based - It can represent dictionaries and lists - It is easy for humans to understand An example: This block of code is an example of YAML (a dict holding a list and a string) Full syntax: http://www.yaml.org/refcard.html 

Para obtenerlo en python, simplemente easy_install pyyaml. Ver http://pyyaml.org/

Viene con funciones fáciles de guardar / cargar archivos, que no recuerdo en este momento.

Escríbalo en un formato serializado, como pickle (un módulo de biblioteca estándar de Python para la serialización) o quizás utilizando JSON (que es una representación que se puede evaluar para producir de nuevo la representación de la memoria).

Esta solución en SourceForge utiliza solo módulos estándar de Python:

y_serial.py module :: warehouse objetos de Python con SQLite

“Serialización + persistencia :: en unas pocas líneas de código, comprima y anote los objetos de Python en SQLite; luego, recupérelos cronológicamente mediante palabras clave sin ningún tipo de SQL. El módulo” estándar “más útil para que una base de datos almacene datos sin esquema”.

http://yserial.sourceforge.net

El bono de compresión probablemente reducirá su diccionario de 6GB a 1GB. Si no desea almacenar una serie de diccionarios, el módulo también contiene una solución file.gz que podría ser más adecuada dado el tamaño de su diccionario.

Aquí hay algunas alternativas dependiendo de sus requerimientos:

  • numpy almacena sus datos simples en una forma compacta y realiza bien las operaciones de grupo / masa

  • shelve es como un dict grande respaldado por un archivo

  • Algunos módulos de almacenamiento de terceros, por ejemplo, stash , almacenan datos simples arbitrarios

  • base de datos adecuada, por ejemplo, mongodb para datos peludos o mysql o sqlite datos simples y recuperación más rápida