Casos de uso comunes para encurtidos en Python

134

He mirado la documentación de pickle , pero no entiendo dónde es útil pickle.

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

satoru
fuente
2
La parte que no entiendo sobre el decapado es ¿por qué no guarda el valor en un archivo? ¿Por qué encurtirlo?
whackamadoodle3000

Respuestas:

59

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/

Dave Kirby
fuente
27
No se deben transferir objetos encurtidos a través de la red u otros canales no confiables, a menos que los datos encurtidos estén cuidadosamente protegidos contra la manipulación. La documentación de pickle advierte explícitamente que nunca elimine datos de fuentes no confiables o no autenticadas.
lunaryorn
44
@lunaryorn: buen punto. Si va a transferir datos encurtidos entre máquinas, utilice un canal seguro como el túnel SSL o SSH.
Dave Kirby el
3
Entonces todavía confías en el punto final para no explotarte, lo que puede estar bien o no, dependiendo del contexto.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
@lunaryorn: buen punto, pero en ese caso, ¿cómo podemos cifrar los datos en el dominio público? ¿tenemos que usar alguna otra lib lib o no usar pickle
Pardeep Sharma
¿Es cierto el punto 4)? Encontré esto que tiene alguna evidencia (antigua) que no funcionaría aquí .
salotz
10

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.

Jacob Oscarson
fuente
8

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.

Mike McKerns
fuente
7

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.

taskinoor
fuente
4

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é.

espartano
fuente
3

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

Malo
fuente
su "respuesta" no es una respuesta, es más un comentario. La pregunta del OP es "¿Cuáles son algunos casos de uso comunes para pickle?". ¿Sientes que has respondido esa pregunta de alguna manera?
Mike McKerns
3
bueno, siento que he respondido la pregunta porque también tuve dificultades para comprender los usos comunes de pickle cuando intenté leer sobre este módulo aquí , aquí y aquí . Porque sobre todo comienzan a explicar qué hace Pickle suponiendo que conoces la motivación detrás de todo el concepto de serialización. Después de leer un artículo wiki simple sobre serialización, comprendí la idea general y los "casos comunes". Tal vez ayude a alguien ...
Mal
y algunos de esos casos comunes son ...? Si hay algunos que no están listados aquí en otras respuestas ... sería muy apropiado agregarlos a su respuesta.
Mike McKerns
2

Para agregar un ejemplo del mundo real: La herramienta de documentación de 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.

Lunaryorn
fuente
1

Puedo decirte los usos para los que lo uso y lo he visto utilizado para:

  • Perfil de juego guardado
  • Los datos del juego se guardan como vidas y salud
  • Registros anteriores de dichos números ingresados ​​a un programa

Esos son los que lo uso por lo menos

Austin Gummy
fuente
1

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.

Divanshu Tak
fuente