2010-08-09 24 views
98

He consultado la documentación de pickle, pero no entiendo dónde es útil pickle.Casos de uso comunes para pickle en Python

¿Cuáles son algunos casos de uso comunes para pickle?

+13

He buscado en Google algo similar, pero Google no es lo suficientemente inteligente como para decirme cómo puede ayudarme un determinado módulo. Sé cómo usar 'pickle', pero lo que quiero saber es en qué escenario lo usan otras personas. – satoru

+39

No hay nada de malo en esta pregunta. – FogleBird

+20

Upvote. Preguntas como estas son muy importantes en Stackoverflow. –

Respuesta

44

Algunos usos que he encontrado:

1) ahorro de los datos del estado de un programa en el disco para que pueda continuar donde lo dejó cuando se reinicia (permanencia)

2) el envío de datos de Python sobre una conexión TCP en una multi-núcleo o sistema distribuido (de clasificación)

3) el almacenamiento de objetos de pitón en una base de datos

4) convertir un objeto pitón arbitraria en una cadena de modo que se pueden utilizar como una clave de diccionario (por ejemplo, para c dolor & memoria).

Existen algunos problemas con este último: dos objetos idénticos pueden ser escabechados y dar como resultado cadenas diferentes, o incluso el mismo objeto escabechado dos veces puede tener diferentes representaciones. Esto se debe a que el pickle puede incluir información de conteo de referencia.

+20

No se deben transferir objetos en escabeche a través de la red u otros canales que no sean de confianza, a menos que los datos en escabeche estén cuidadosamente protegidos contra la manipulación. La documentación de pickle advierte explícitamente que * nunca * deshace datos de fuentes no confiables o no confiables. – lunaryorn

+4

@lunaryorn: buen punto. Si vas a transferir datos en escabeche entre máquinas, utiliza un canal seguro como el túnel SSL o SSH. –

+3

Entonces todavía confía en que el punto extremo no lo explote, lo cual puede estar o no bien, dependiendo del contexto. –

9

Mínimo ejemplo ida y vuelta ..

>>> import pickle 
>>> a = Anon() 
>>> a.foo = 'bar' 
>>> pickled = pickle.dumps(a) 
>>> unpickled = pickle.loads(pickled) 
>>> unpickled.foo 
'bar' 

Editar: pero en cuanto a la cuestión de ejemplos del mundo real de decapado, quizás el uso más avanzado de decapado (que tendría que cavar muy profundamente en la fuente) es ZODB: http://svn.zope.org/

De lo contrario, PyPI menciona varias: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

He visto personalmente varios ejemplos de objetos en escabela que se envían a través de la red como un protocolo de transferencia de red fácil de usar.

5

Lo he usado en uno de mis proyectos. Si la aplicación se terminó durante su funcionamiento (se realizó una larga tarea y se procesaron muchos datos), tuve que guardar toda la estructura de datos y volver a cargarla después de que la aplicación se ejecutara nuevamente. Usé cPickle para esto, ya que la velocidad era algo crucial y el tamaño de los datos era realmente grande.

2

Para agregar un ejemplo del mundo real: La herramienta de documentación Sphinx para Python utiliza pickle para almacenar en caché documentos analizados y referencias cruzadas entre documentos, para acelerar las compilaciones posteriores de la documentación.

5

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

Decir que quería hacer un paralelo con mapas reducir (o nodos a través de racimo con pyina) multiprocessing, entonces usted necesita para asegurarse de que la función que desea han asignado recursos a través de las paralelas se conservar en vinagre. 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 comprender qué causa que su decapado falle cuando falla su código.

Y, sí, las personas usan picking para guardar el estado de un cálculo, o su sesión ipython, o lo que sea.

3

Para el principiante (como es el caso conmigo) es realmente difícil de entender por qué utilizar pickle en primer lugar al leer el official documentation. Es tal vez porque los documentos implican que ya conoces el propósito de la serialización. Solo después de leer general description de serialización he entendido el motivo de este módulo y sus casos de uso común. También amplias explicaciones de serialización sin tener en cuenta un determinado lenguaje de programación pueden ayudar: https://stackoverflow.com/a/14482962/4383472, What is serialization?, https://stackoverflow.com/a/3984483/4383472

+0

su "respuesta" no es una respuesta, es más un comentario. La pregunta del OP es "¿Cuáles son algunos casos de uso común para el encurtido?". ¿Sientes que has respondido esa pregunta de alguna manera? –

+1

Bueno, creo que he respondido la pregunta porque también tuve dificultades para entender los usos comunes de pickle cuando intenté leer sobre este módulo [aquí] (https://docs.python.org/3.4/library/pickle. html), [aquí] (http://en.wikipedia.org/wiki/Pickle_ (Python)) y [aquí] (http://pymotw.com/2/pickle/index.html). Porque en su mayoría comienzan a explicar qué es pickle si se supone que se conoce la motivación detrás de todo el concepto de serialización. Después de leer un artículo simple de wiki sobre serialización, entendí la idea general así como los "casos comunes".Tal vez ayude a alguien ... – Bad

+0

y algunos de esos casos comunes son ...? Si hay algunos que no se enumeran aquí en otras respuestas ... agregarlos a su respuesta sería muy apropiado. –

1

te puedo decir que los usos lo uso para y he visto que se usa para:

  • Juego el perfil guarda
  • Guarda datos del juego como vidas y salud
  • Registros previos de decir números asignados a un programa

Esos son los que utilizo durante al menos

0

la salmuera es como "Guardar como .." y "abierto .." para sus estructuras de datos y clases. Digamos que quiero guardar mis estructuras de datos para que sea persistente entre las ejecuciones del programa.

Ahorro:

with open("save.p", "wb") as f:  
    pickle.dump(myStuff, f)   

Carga:

try: 
    with open("save.p", "rb") as f: 
     myStuff = pickle.load(f) 
except: 
    myStuff = defaultdict(dict) 

Ahora no tengo para construir mystuff desde cero otra vez, y yo sólo puedo escoger (le) desde donde lo dejé apagado.