2009-07-27 12 views

Respuesta

9

Decapado es una moneda de dos caras.

Por un lado, tiene una manera de almacenar su objeto de una manera muy fácil. Solo cuatro líneas de código y usted salmuera. Tienes el objeto exactamente como es.

Por otro lado, puede convertirse en una pesadilla de compatibilidad. No puede desordenar objetos si no están definidos en su código, exactamente como se definieron cuando se decaparon. Esto limita fuertemente su capacidad para refactorizar el código, o reorganizar cosas en sus módulos. Además, no todo se puede conservar en escabeche, y si no es estricto con lo que obtiene en escabeche y el cliente de su código tiene total libertad para incluir cualquier objeto, tarde o temprano pasará algo no disponible a su sistema, y ​​el sistema se irá auge.

Tenga mucho cuidado con su uso. no hay mejor definición de rápido y sucio.

+1

+1 por el problema relacionado con la refactorización –

2

Tenga en cuenta que no todos los objetos pueden ser escabeados directamente, solo los tipos básicos u objetos que han definido el protocolo pickle.
Usar su propio formato binario le permitiría potencialmente almacenar cualquier tipo de objeto.

Para tener en cuenta, Zope Object DB (ZODB) sigue el mismo enfoque, almacenando objetos con el formato Pickle. Puede estar interesado en obtener sus implementaciones.

+2

salmuera puede manejar la mayoría de las clases definidas por el usuario sin código adicional. solo tiene que definir un manejo especial del protocolo pickle para algunos casos. – Nelson

1

Las ventajas potenciales de un formato personalizado sobre un pepinillo son:

  • puede obtener selectivamente objetos individuales, en lugar de tener que encarnar el conjunto completo de objetos
  • puede consultar subconjuntos de objetos por propiedades y solo cargue los objetos que coincidan con sus criterios

Si estas ventajas se materializan depende de cómo diseñe el almacenamiento, por supuesto.

3

Una razón para definir su propio formato binario personalizado podría ser la optimización. pickle (y shelve, que usa pickle) es un marco de serialización genérico; puede almacenar casi todos los datos de Python. Es fácil usar Pickle en muchas situaciones, pero lleva tiempo inspeccionar todos los objetos y serializar sus datos y los datos en sí se almacenan en un formato genérico y detallado. Si está almacenando datos conocidos específicos, un serializador personalizado puede ser más rápido y conciso.

Se necesita 37 bytes para conservar en vinagre un objeto con un único valor entero:

>>> import pickle 
>>> class Foo: pass... 
>>> foo = Foo() 
>>> foo.x = 3 
>>> print repr(pickle.dumps(foo)) 
"(i__main__\nFoo\np0\n(dp1\nS'x'\np2\nI3\nsb." 

Embedded en que los datos es el nombre de la propiedad y su tipo. Un serializador personalizado para Foo (y Foo solo) podría prescindir de eso y simplemente almacenar el número, ahorrando tiempo y espacio.

Otra razón para un marco de serialización personalizado es que puede realizar fácilmente validación y control de versiones personalizadas de los datos. Si cambias tus tipos de objetos y necesitas cargar una versión anterior de los datos, puede ser complicado a través de pickle. Su propio código se puede personalizar fácilmente para manejar formatos de datos más antiguos.

En la práctica, construiría algo utilizando el módulo genérico cPickle y solo lo reemplazaría si el perfil indicaba que era realmente importante. Mantener una estructura de serialización separada es una gran cantidad de trabajo.

Un último recurso que puede serle útil: some synthetic serializer benchmarks. cPickle es bastante rápido.

1

Si va a hacer eso (implementar su propio formato binario), primero debe saber que python tiene una buena biblioteca para manejar HDF5, un formato binario utilizado en física y astronomía para volcar grandes cantidades de datos.

Esta es la página principal de la biblioteca:

Básicamente, se podría pensar en HDF5 como una base de datos jerárquica, en la que una columna de tabla puede contener una tabla interna por sí mismo : la tabla Poblaciones tiene una columna llamada Individual, que es una tabla que contiene la información de cada individuo, etc ...

PyTables también tiene su propia implementación del módulo cPickle, puede acc ESS con:

$ easy_install tables 
$ python 
>>> import tables 
>>> tables.cPickle 

nunca he utilizado salmuera de pytable, pero creo que puede ser sencillo para que usted pueda aprender cómo funciona, lo que puede tener una mirada en ella antes de implementar su propio formato.

0

¿Alguna vez necesitará procesar datos de fuentes que no sean de confianza? Si es así, debe saber que el formato de pickle es en realidad una máquina virtual que es capaz de ejecutar código arbitrario en nombre del proceso que está deshaciendo.

1

Ver esta solución en SourceForge: objetos módulo :: almacén Python

y_serial.py con SQLite

"serialización + persistencia :: en unas pocas líneas de código, comprimir y anotar Python objetos en SQLite; luego, los recupera cronológicamente por palabras clave sin ningún SQL. El módulo "estándar" más útil para que una base de datos almacene datos sin esquema ".

http://yserial.sourceforge.net

[El comentario se incluye con las notas finales de código analiza por qué la salmuera fue seleccionado sobre JSON.]

+0

si usa pickle no es seguro para un proyecto basado en web, ¿eso es todo? – amirouche

+0

y_serial solo deshace pepinillos confiables creados por sus propias funciones, por lo tanto es seguro. Debería leer las notas al final en el módulo en sí que brinda una explicación detallada. –

Cuestiones relacionadas