2009-05-20 11 views
28

Embaucamiento más específico de 875228—Simple data storing in Python.Python: ¿Cómo escribo una lista en un archivo y luego la vuelvo a poner en la memoria (dict representada como una cadena convertir a dict) más tarde?

Tengo un dict bastante grande (6 GB) y necesito procesarlo. Estoy probando varios métodos de agrupación de documentos, así que tengo que tener todo en la memoria a la vez. Tengo otras funciones para ejecutar con 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 forma de escribir este diccionario en un archivo, para que pueda cargarlo en la memoria en lugar de volver a calcular todos sus valores.

para simplificar las cosas se ve algo así como: {((('palabra', 'lista'), (1,2), (1,3)), (...)): 0.0, .. ..}

siento que pitón debe tener una mejor forma que yo bucle alrededor a través de un trozo de cuerda en busca de:. y (intentar analizar en un diccionario

+1

Ver http://stackoverflow.com/questions/875228/simple-data-storing-in-python para una versión más general de esta misma pregunta . –

+0

Usaría [ZODB] (http://en.wikipedia.org/wiki/Zope_Object_Database) si necesita una dict demasiado grande para caber en la memoria para ser persistente. – Unknown

Respuesta

58

por qué no usar python pickle Python tiene una gran? serializar el módulo llamado pickle 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 salmuera:

  • no es seguro contra errónea o datos maliciosamente construidos. Nunca datos sin procesar recibidos de una fuente no confiable o no autenticada.
  • El formato no es legible para humanos.

Si está utilizando Python 2.6 hay un módulo integrado llamado json. Es tan fácil como salmuera de empleo:

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

formato JSON es legible por el hombre y es muy similar a la representación de cadena diccionario en Python. Y no tiene ningún problema de seguridad como pickle. Pero podría ser más lento que cPickle.

+0

También he visto que pickle ocupa más memoria que un archivo de texto. –

0

Escríbalo en un formato serializado, como pickle (un módulo de biblioteca estándar de python para la serialización) o tal vez mediante el uso de JSON (que es una representación que se puede evadir para producir la representación de memoria de nuevo).

4

Yo sugeriría que utilice YAML para el formato de archivo para que pueda jugar con él 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 conseguirlo en Python, simplemente easy_install PyYAML. Ver http://pyyaml.org/

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

12

Yo usaría shelve, json, yaml, o lo que sea, como lo sugieren otras respuestas.

shelve es especialmente genial porque puede tener el dict en el disco y seguir usándolo. Los valores se cargarán bajo demanda.

Pero si realmente quiere analizar el texto de la dict, y contiene sólo str Ings, int s y s tuple como que ha mostrado, puede utilizar ast.literal_eval a analizarlo. Es mucho más seguro, ya que se puede expresiones completas no eval con él - Sólo funciona con str Ings, números, tuple s, list s, s, dictbool edios y None:

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

esta solución en SourceForge utiliza módulos de Python único estándar: objetos de módulo :: almacén Python

y_serial.py con SQLite

"serialización + persistance :: en unas pocas líneas de código, comprimir y anotar Python objetos en SQLite; luego más tarde recuperarlos cronológicamente por ke ywords sin ningún SQL. Más útil módulo "estándar" para una base de datos a los datos sin esquema de la tienda."

http://yserial.sourceforge.net

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

0

Estas son algunas alternativas en función de sus necesidades:.

  • numpy almacena su p operaciones de grupo/masa de datos permanecido en una forma compacta y se comporta bien

  • shelve es como una gran dict el respaldo de un archivo

  • algún módulo de almacenamiento tercera parte, por ejemplo, stash, almacena datos planos arbitrarios

  • base de datos adecuada, p. mongodb para los datos peludas o MySQL o SQLite datos sin ilustrar y una recuperación más rápida

Cuestiones relacionadas