Aquí podría ser tu PUBLICIDAD


Python: mariscal / pickle incrementalmente un objeto?

votos
4

Tengo un objeto grande que me gustaría serializar en el disco. Estoy encontrando que Marshal funciona bastante bien y es agradable y rápido.

En este momento estoy creando mi objeto grande y luego llamando a marshal.dump. Me gustaría evitar sostener el objeto grande en la memoria si es posible; me gustaría volcarlo gradualmente a medida que lo construyo. ¿Es eso posible?

El objeto es bastante simple, un diccionario de matrices.

Publicado el 12/03/2009 a las 19:08
fuente por usuario Parand
En otros idiomas...        العربية       

4 respuestas

votos
4

Todo lo que tu objeto tiene que hacer es ser un diccionario de listas, entonces puedes usar el módulo de estantería . Presenta una interfaz tipo diccionario donde las claves y los valores se almacenan en un archivo de base de datos en lugar de en la memoria. Una limitación que puede afectarlo o no es que las claves en los objetos de Shelf deben ser cadenas. El almacenamiento de valores será más eficiente si especifica protocol = -1 cuando crea el objeto Shelf para que utilice una representación binaria más eficiente.

Respondida el 14/03/2009 a las 08:22
fuente por usuario Theran


Aquí podría ser tu PUBLICIDAD


votos
4

Las funciones 'hashopen' y 'btopen' del módulo bsddb proporcionan una interfaz persistente tipo diccionario. ¿Quizás podría usar uno de estos, en lugar de un diccionario normal, para serializar incrementalmente las matrices en el disco?

import bsddb
import marshal

db = bsddb.hashopen('file.db')
db['array1'] = marshal.dumps(array1)
db['array2'] = marshal.dumps(array2)
...
db.close()

Para recuperar las matrices:

db = bsddb.hashopen('file.db')
array1 = marshal.loads(db['array1'])
...
Respondida el 14/03/2009 a las 01:57
fuente por usuario elo80ka

votos
0

Debería poder descargar el elemento pieza por pieza en el archivo. Las dos preguntas de diseño que necesitan solución son:

  1. ¿Cómo estás construyendo el objeto cuando lo estás poniendo en la memoria?
  2. ¿Cómo necesitas tus datos cuando se salen de la memoria?

Si el proceso de compilación completa toda la matriz asociada a una clave determinada a la vez, puede simplemente volcar la clave: par de arreglos en un archivo como un diccionario separado:

big_hairy_dictionary['sample_key'] = pre_existing_array
marshal.dump({'sample_key':big_hairy_dictionary['sample_key']},'central_file')

Luego, en la actualización, cada llamada a marshal.load ('archivo_central') devolverá un diccionario que puede usar para actualizar un diccionario central. Pero esto solo será útil si, cuando necesita recuperar los datos, desea manejar la lectura 'archivo_central' una vez por clave.

Alternativamente, si está completando arrays elemento por elemento sin un orden particular, quizás intente:

big_hairy_dictionary['sample_key'].append(single_element)
marshal.dump(single_element,'marshaled_files/'+'sample_key')

Luego, cuando lo cargue nuevamente, no necesariamente necesita construir todo el diccionario para recuperar lo que necesita; simplemente llama a marshal.load ('marshaled_files / sample_key') hasta que devuelva None, y tienes todo asociado con la clave.

Respondida el 13/03/2009 a las 02:37
fuente por usuario David Berger

votos
0

Esto depende mucho de cómo estás construyendo el objeto. ¿Es una matriz de sub objetos? Puede alinear / recortar cada elemento de la matriz a medida que lo construye. Es un diccionario? Se aplica la misma idea (mariscal / llaves encurtidas)

Si se trata de un gran objeto complejo de harry, es posible que desee ordenar el volcado de cada pieza del objeto, y luego aplicar lo que sea que sea el proceso de "construcción" cuando lo vuelva a leer.

Respondida el 12/03/2009 a las 08:14
fuente por usuario thebigjc