Casi d'uso comuni per pickle in Python


134

Ho esaminato la documentazione del sottaceto , ma non capisco dove sia utile il sottaceto.

Quali sono alcuni casi d'uso comuni per il sottaceto?


2
La parte che non capisco del decapaggio è perché non salvi semplicemente il valore in un file? Perché sottaceto?
whackamadoodle3000,

Risposte:


59

Alcuni usi che ho riscontrato:

1) salvataggio dei dati di stato di un programma su disco in modo che possa continuare da dove era stato interrotto al riavvio (persistenza)

2) invio di dati Python su una connessione TCP in un sistema multi-core o distribuito (marshalling)

3) memorizzazione di oggetti Python in un database

4) convertire un oggetto Python arbitrario in una stringa in modo che possa essere utilizzato come chiave di dizionario (ad es. Per memorizzazione nella cache e memoization).

Ci sono alcuni problemi con l'ultimo - due oggetti identici possono essere decapati e comportare stringhe diverse - o anche lo stesso oggetto decapato due volte può avere rappresentazioni diverse. Questo perché il pickle può includere informazioni sul conteggio dei riferimenti.

Per enfatizzare il commento di @ lunaryorn - non dovresti mai estrarre una stringa da una fonte non attendibile, poiché un pickle accuratamente realizzato potrebbe eseguire codice arbitrario sul tuo sistema. Ad esempio, vedi https://blog.nelhage.com/2011/03/exploiting-pickle/


27
Non si dovrebbero trasferire oggetti in salamoia sulla rete o altri canali non attendibili, a meno che i dati in salamoia non siano accuratamente protetti contro la manipolazione. La documentazione pickle avverte esplicitamente di non estrarre mai i dati da fonti non attendibili o non autenticate.
lunaryorn,

4
@lunaryorn: buon punto. Se hai intenzione di trasferire dati decapati tra macchine, usa un canale sicuro come tunneling SSL o SSH.
Dave Kirby,

3
Quindi ti stai ancora fidando dell'endpoint per non sfruttarti, il che può essere o meno a posto, a seconda del contesto.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@lunaryorn - buon punto, ma in quel caso come possiamo crittografare i dati di dominio pubblico. dobbiamo usare qualche altra lib py o non usare pickle
Pardeep Sharma

Il punto 4) è vero? Ho trovato questo che ha alcune (vecchie) prove che non funzionerebbero qui .
Salotz,

10

Esempio di andata e ritorno minimo

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

Modifica: ma per quanto riguarda la domanda di esempi reali di decapaggio, forse l' uso più avanzato del decapaggio (dovresti scavare abbastanza in profondità nella fonte) è ZODB: http://svn.zope.org/

Altrimenti, PyPI ne menziona diversi: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Ho visto personalmente diversi esempi di oggetti in salamoia inviati sulla rete come protocollo di trasferimento di rete facile da usare.


8

Il decapaggio è assolutamente necessario per il calcolo distribuito e parallelo.

Supponi di voler fare una riduzione della mappa parallela con multiprocessing(o tra i nodi del cluster con pyina ), quindi devi assicurarti che la funzione che desideri avere mappata tra le risorse parallele si sgretoli. In caso contrario, non è possibile inviarlo ad altre risorse su un altro processo, computer, ecc. Vedere anche qui per un buon esempio.

Per fare questo, uso l' aneto , che può serializzare quasi tutto in Python. Dill ha anche alcuni buoni strumenti per aiutarti a capire cosa sta causando il fallimento del decapaggio in caso di errore del codice.

E, sì, le persone usano la selezione per salvare lo stato di un calcolo, la sessione di ipython o qualsiasi altra cosa.


7

L'ho usato in uno dei miei progetti. Se l'app è stata terminata durante il suo funzionamento (ha svolto un compito lungo ed elaborato molti dati), dovevo salvare l'intera struttura dei dati e ricaricarla dopo che l'app è stata eseguita di nuovo. Ho usato cPickle per questo, poiché la velocità era una cosa cruciale e la dimensione dei dati era davvero grande.


4

Pickle è come "Salva con nome .." e "Apri .." per le strutture e le classi di dati. Diciamo che voglio salvare le mie strutture di dati in modo che sia persistente tra le esecuzioni del programma.

Salvataggio:

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

Caricamento in corso:

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

Ora non ho più bisogno di ricostruire myStuff da zero, e posso semplicemente prendere (le) da dove avevo interrotto.


3

Per il principiante (come nel caso di me) è davvero difficile capire perché usare il sottaceto in primo luogo quando si legge la documentazione ufficiale . Forse perché i documenti implicano che conosci già l'intero scopo della serializzazione. Solo dopo aver letto la descrizione generale della serializzazione ho compreso il motivo di questo modulo e dei suoi casi d'uso comuni. Anche ampie spiegazioni della serializzazione ignorando un particolare linguaggio di programmazione possono essere di aiuto: https://stackoverflow.com/a/14482962/4383472 , Che cos'è la serializzazione? , https://stackoverflow.com/a/3984483/4383472


la tua "risposta" non è una risposta, è più un commento. La domanda del PO è "Quali sono alcuni casi d'uso comuni per il sottaceto?". Pensi di aver risposto a questa domanda in qualche modo?
Mike McKerns,

3
beh, sento di aver risposto alla domanda perché ho anche avuto difficoltà a capire gli usi comuni del sottaceto quando ho provato a leggere su questo modulo qui , qui e qui . Perché per lo più iniziano a spiegare cosa fa il sottaceto assumendo che tu conosca la motivazione dietro l'intero concetto di serializzazione. Dopo aver letto un semplice articolo wiki sulla serializzazione, ho compreso l'idea generale e i "casi comuni". Forse aiuterà qualcuno ...
Bad

e alcuni di questi casi comuni sono ...? Se ce ne sono alcuni che non sono elencati qui in altre risposte ... aggiungerli alla tua risposta sarebbe molto appropriato.
Mike McKerns,

2

Per aggiungere un esempio reale: lo strumento di documentazione Sphinx per Python utilizza pickle per memorizzare nella cache documenti analizzati e riferimenti incrociati tra i documenti, per accelerare le successive build della documentazione.


1

Posso dirti gli usi per cui lo uso e l'ho visto usato per:

  • Salvataggio del profilo di gioco
  • I dati di gioco salvano vite e salute
  • Record precedenti di numeri dire immessi in un programma

Sono quelli per cui lo uso almeno


1

Uso il decapaggio durante la demolizione web di uno dei siti Web in quel momento, voglio archiviare più di 8000.000 URL e voglio elaborarli il più velocemente possibile, quindi uso il decapaggio perché la sua qualità di output è molto alta.

è possibile raggiungere facilmente l'URL e il punto in cui si interrompe anche la parola chiave della directory dei lavori è inoltre possibile recuperare i dettagli dell'URL molto velocemente per riprendere il processo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.