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:
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