2012-01-23 28 views
63

Entendí que el decapado de Python es una forma de 'almacenar' un Objeto Python de una manera que respeta la programación de Objetos, diferente de una salida escrita en un archivo txt o DB.serialización Python - ¿Por qué pickle?

¿Tiene más detalles o referencias en los siguientes puntos:

  • , donde están en escabeche objetos 'almacenado'?
  • ¿por qué la conservación de objetos en conserva conserva más que, por ejemplo, el almacenamiento en DB?
  • ¿Puedo recuperar objetos en escabeche de una sesión de shell de Python a otra?
  • ¿Tiene ejemplos significativos cuando la serialización es útil?
  • ¿La serialización con pickle implica datos de "compresión"?

En otras palabras, estoy buscando un documento sobre decapado: Python.doc explica cómo implementar pickle pero no parece profundizar en los detalles sobre el uso y la necesidad de la serialización.

+0

Para ahorrar estado para una restauración posterior o para compartir/copiar un objeto a un tiempo de ejecución de python diferente, sería mi suposición. – synthesizerpatel

+12

Muchas de sus preguntas son respondidas por el artículo de Wikipedia sobre serialización: http://en.wikipedia.org/wiki/Serialization – NPE

+5

¿Está preguntando por qué necesitaría Pickle para la serialización en Python ?, o mejor dicho, qué es (el propósito de) serialización después de todo? _. – moooeeeep

Respuesta

78

Decapado es una forma de convertir un objeto python (list, dict, etc.) en una secuencia de caracteres. La idea es que esta secuencia de caracteres contenga toda la información necesaria para reconstruir el objeto en otra secuencia de comandos de python.

En cuanto a dónde se almacena la información en vinagre, por lo general uno haría:

with open('filename', 'wb') as f: 
    var = {1 : 'a' , 2 : 'b'} 
    pickle.dump(var, f) 

que almacenaría la versión en escabeche de nuestra var dict en el archivo 'nombre'. Luego, en otra escritura, se puede cargar desde este archivo en una variable y el diccionario sería recreada:

with open('filename','rb') as f: 
    var = pickle.load(f) 

Otro uso para el decapado es si tiene que transmitir este diccionario través de una red (tal vez con tomas o algo .) Primero debe convertirlo en un flujo de caracteres, luego puede enviarlo a través de una conexión de socket.

Además, no hay "compresión" de la que hablar aquí ... es solo una forma de convertir de una representación (en RAM) a otra (en "texto").

About.com tiene una buena introducción de decapado here.

+2

por lo general uno haría 'with open ('filename') como f: ...' – moooeeeep

+0

ah sí ... eso es más resistente a los errores. Gracias. – austin1howard

+3

Además, necesitaría 'con abrir (nombre de archivo, 'wb') como f: ...' o no podría escribir en el archivo. –

29

El decapado es absolutamente necesario para la informática distribuida y paralela.

Digamos que quería hacer una reducción de mapa paralela con multiprocessing (o entre nodos de clúster con pyina), entonces debe asegurarse de que la función que desea asignar a través de los recursos paralelos saltará. Si no funciona, no puede enviarlo a otros recursos en otro proceso, computadora, etc. También vea here para obtener un buen ejemplo.

Para hacer esto, uso dill, que puede serializar casi cualquier cosa en python. Dill también tiene some good tools para ayudarlo a entender qué es lo que está causando que su decapado falle cuando falla su código.

Y, sí, la gente usa picking para guardar el estado de un cálculo, o su sesión ipython, o lo que sea. También puede extender Pickler y UnPickler de Pickle para hacer la compresión con bz2 o gzip si lo desea.

Cuestiones relacionadas