Más específica víctima de 875228—Simple almacenamiento de datos en Python.

Tengo una bastante grande dict (6 GB) y necesito hacer algún tipo de procesamiento en él. Estoy tratando de salir de documentos varios métodos de agrupamiento, por lo que necesito tener toda la cosa, en memoria a la vez. Tengo otras funciones a ejecutar en este tipo de datos, pero el contenido no va a cambiar.

Actualmente, cada vez que pienso en nuevas funciones que tengo que escribir, y, a continuación, vuelva a generar el diccionario. Estoy buscando una manera de escribir este dict a un archivo, de modo que yo pueda cargar en la memoria en lugar de volver a calcular todos los valores.

a simplificar en exceso las cosas se ve algo como:
{(((‘palabra’,’lista’),(1,2),(1,3)),(…)):0.0, ….}

Creo que python debe haber una manera mejor que me bucle alrededor a través de algunos cadena buscando : y ( tratando de analizarlo en un diccionario.

  • Me gustaría utilizar el ZODB si usted necesita un dict demasiado grande para caber en la memoria para ser persistente.
  • Consulte stackoverflow.com/questions/875228/… para una versión más general de esta misma pregunta.
InformationsquelleAutor | 2009-05-20

6 Comentarios

  1. 60

    ¿Por qué no utilizar python pepinillo?
    Python tiene una gran serializar módulo llamado pickles 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 errónea o
      maliciosamente construido de datos. Nunca
      unpickle los datos recibidos de un
      que no son de confianza o no autenticado fuente.
    • El formato no es legible por humanos.

    Si usted está usando python 2.6 hay incorporado un módulo llamado json. Es tan fácil como la salmuera de uso:

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

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

    • También he visto que los pepinillos ocupa más memoria que un archivo de texto.
  2. 12

    Yo uso la guardar, json, yaml, o lo que sea, como se sugiere por otras respuestas.

    shelve es especialmente genial, porque puedes tener la dict en el disco y todavía lo utilizan. Los valores serán cargados en la demanda.

    Pero si usted realmente desea analizar el texto de la dict, y contiene sólo strings, ints y tuples como se ha demostrado, puede utilizar ast.literal_eval analizarlo. Es mucho más seguro, ya que no se puede eval completo expresiones con él – sólo funciona con strings, números, tuples, lists, dicts, booleans, y None:

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

    Me gustaría sugerir que el uso YAML para el formato de archivo de modo que usted puede 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 meterse en python, sólo easy_install pyyaml. Ver http://pyyaml.org/

    Viene con fácil de guardar archivo /funciones de carga, que no recuerdo en este momento.

  4. 0

    Escribir en un formato serializado, tales como la salmuera (una biblioteca estándar de python módulo para la serialización) o tal vez por el uso de JSON (que es una representación que puede ser evaled para producir la representación de la memoria de nuevo).

  5. 0

    Esta solución en SourceForge sólo utiliza los módulos estándar de Python:

    y_serial.py módulo :: almacén de objetos de Python con SQLite

    «Serialización + persistencia :: en un par de líneas de código, comprimir y anotar los objetos de Python en SQLite; luego recuperar en orden cronológico por palabras clave sin ningún tipo de SQL. Más útil «estándar» módulo para una base de datos para almacenar menos de esquema de datos.»

    http://yserial.sourceforge.net

    La compresión de bonificación probablemente reducirá su 6GB diccionario de 1GB. Si usted no desea almacenar una serie de diccionarios, el módulo también contiene un file.gz la solución, que podría ser más adecuado teniendo en cuenta su tamaño del diccionario.

  6. 0

    Aquí hay un par de alternativas en función de sus necesidades:

    • numpy almacena sus datos sin formato en un formato compacto y realiza el grupo de la masa/masa bien las operaciones

    • shelve es como un gran dict respaldado por un archivo

    • algunos 3er partido módulo de almacenamiento, por ejemplo,stash, tiendas arbitraria de datos sin formato

    • adecuada de la base de datos, por ejemplo, mongodb para peludo o de datos mysql o sqlite llanura de datos y una recuperación más rápida

Dejar respuesta

Please enter your comment!
Please enter your name here