Respuestas:
Algunos usos que he encontrado:
1) guardar los datos de estado de un programa en el disco para que pueda continuar donde lo dejó cuando se reinicia (persistencia)
2) envío de datos de python a través de una conexión TCP en un sistema distribuido o de múltiples núcleos (cálculo de referencias)
3) almacenar objetos de python en una base de datos
4) convertir un objeto python arbitrario en una cadena para que pueda usarse como clave de diccionario (por ejemplo, para el almacenamiento en caché y la memorización).
Hay algunos problemas con el último: dos objetos idénticos pueden ser encurtidos y dar lugar a diferentes cadenas, o incluso el mismo objeto encurtido dos veces puede tener diferentes representaciones. Esto se debe a que el pepinillo puede incluir información de recuento de referencia.
Para enfatizar el comentario de @ lunaryorn, nunca debe quitar una cadena de una fuente no confiable, ya que un pepinillo cuidadosamente diseñado podría ejecutar código arbitrario en su sistema. Por ejemplo, consulte https://blog.nelhage.com/2011/03/exploiting-pickle/
Ejemplo mínimo de 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 los ejemplos de decapado en el mundo real, quizás el uso más avanzado de decapado (tendría que profundizar bastante en la fuente) es ZODB: http://svn.zope.org/
De lo contrario, PyPI menciona varios: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
Personalmente, he visto varios ejemplos de objetos en escabeche que se envían a través de la red como un protocolo de transferencia de red fácil de usar.
El decapado es absolutamente necesario para la computación distribuida y paralela.
Supongamos que desea hacer una reducción de mapa paralela con multiprocessing
(o en todos los nodos del clúster con pyina ), luego debe asegurarse de que la función que desea asignar a través de los recursos paralelos se enredará. Si no se conserva en vinagre, no puede enviarlo a otros recursos en otro proceso, computadora, etc. También vea aquí un buen ejemplo.
Para hacer esto, uso eneldo , que puede serializar casi cualquier cosa en python. Dill también tiene algunas buenas herramientas para ayudarlo a comprender qué está causando que su decapado falle cuando falla su código.
Y sí, la gente usa la selección para guardar el estado de un cálculo, o su sesión de ipython , o lo que sea.
Lo he usado en uno de mis proyectos. Si la aplicación se terminó durante su funcionamiento (realizó una tarea larga y procesó muchos datos), necesitaba guardar toda la estructura de datos y volver a cargarla después de que la aplicación se volviera a ejecutar. Utilicé cPickle para esto, ya que la velocidad era algo crucial y el tamaño de los datos era realmente grande.
Pickle es como "Guardar como ..." y "Abrir .." 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)
Cargando:
try:
with open("save.p", "rb") as f:
myStuff = pickle.load(f)
except:
myStuff = defaultdict(dict)
Ahora no tengo que volver a construir myStuff desde cero, y puedo continuar desde donde lo dejé.
Para el principiante (como es el caso conmigo) es realmente difícil entender por qué usar pickle en primer lugar al leer la documentación oficial . Tal vez sea porque los documentos implican que ya conoces el propósito completo de la serialización. Solo después de leer la descripción general de la serialización, he entendido la razón de este módulo y sus casos de uso comunes. También pueden ayudar las explicaciones amplias de la serialización sin tener en cuenta un lenguaje de programación particular: https://stackoverflow.com/a/14482962/4383472 , ¿Qué es la serialización? , https://stackoverflow.com/a/3984483/4383472
Puedo decirte los usos para los que lo uso y lo he visto utilizado para:
Esos son los que lo uso por lo menos
Utilizo pickling durante el desguace web de un sitio web en ese momento. Quiero almacenar más de 8000k urls y quiero procesarlas lo más rápido posible, así que utilizo pickling porque su calidad de salida es muy alta.
puede llegar fácilmente a la URL y donde detiene incluso la palabra clave del directorio de trabajo también obtiene los detalles de la URL muy rápido para reanudar el proceso.