wake-up-neo.com

Häufige Anwendungsfälle für Pickle in Python

Ich habe mir die pickle Dokumentation angesehen, aber ich verstehe nicht, wo Gurke nützlich ist.

Was sind einige häufige Anwendungsfälle für Gurke?

125
satoru

Einige Verwendungszwecke, auf die ich gestoßen bin:

1) Speichern der Statusdaten eines Programms auf der Festplatte, damit es dort weitermachen kann, wo es beim Neustart aufgehört hat (Persistenz)

2) Senden von python Daten über eine TCP Verbindung in einem Mehrkern- oder verteilten System (Marshalling)

3) Speichern von python Objekten in einer Datenbank

4) Konvertieren eines beliebigen python Objektes in eine Zeichenkette, so dass es als Wörterbuchschlüssel verwendet werden kann (z. B. zum Zwischenspeichern und Merken).

Es gibt einige Probleme mit dem letzten - zwei identische Objekte können gebeizt werden und zu unterschiedlichen Zeichenfolgen führen - oder sogar dasselbe Objekt, das zweimal gebeizt wird, kann unterschiedliche Darstellungen haben. Dies liegt daran, dass der Pickel Referenzzählinformationen enthalten kann.

Um den Kommentar von @ lunaryorn zu betonen: Sie sollten niemals einen String aus einer nicht vertrauenswürdigen Quelle entfernen, da eine sorgfältig gestaltete Auswahl beliebigen Code auf Ihrem System ausführen kann. Zum Beispiel siehe https://blog.nelhage.com/2011/03/exploiting-pickle/

55
Dave Kirby

Beispiel für eine minimale Hin- und Rückfahrt.

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

Edit: aber für die Frage der realen Beispiele des Beizens, vielleicht das fortgeschrittenste Verwendung des Beizens ( Sie müssten ganz tief in die Quelle eintauchen) ist ZODB: http://svn.zope.org/

Andernfalls erwähnt PyPI mehrere: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Ich persönlich habe einige Beispiele für gekapselte Objekte gesehen, die als einfach zu verwendendes Netzwerkübertragungsprotokoll über das Netzwerk gesendet wurden.

10
Jacob Oscarson

Für verteiltes und paralleles Rechnen ist das Beizen unbedingt erforderlich.

Angenommen, Sie möchten eine parallele Map-Reduzierung mit multiprocessing (oder über Clusterknoten mit pyina ) durchführen. Dann müssen Sie sicherstellen, dass die Funktion, die Sie zuordnen möchten, über die parallelen Ressourcen verteilt ist wird beizen. Wenn dies nicht der Fall ist, können Sie es nicht an die anderen Ressourcen eines anderen Prozesses, Computers usw. senden. Ein gutes Beispiel finden Sie auch unter hier .

Dazu benutze ich Dill , das fast alles in Python serialisieren kann. Dill hat auch einige gute Werkzeuge , um Ihnen zu helfen, zu verstehen, warum das Beizen fehlschlägt, wenn Ihr Code ausfällt.

Und ja, die Leute verwenden die Auswahl, um den Status einer Berechnung oder Ihrer ipython -Sitzung oder was auch immer zu speichern.

7
Mike McKerns

Ich habe es in einem meiner Projekte verwendet. Wenn die App während der Arbeit beendet wurde (es war eine langwierige Aufgabe und es wurden viele Daten verarbeitet), musste ich die gesamte Datenstruktur speichern und neu laden, nachdem die App erneut ausgeführt wurde. Ich habe dafür cPickle verwendet, da die Geschwindigkeit eine entscheidende Rolle spielte und die Datenmenge sehr groß war.

7
taskinoor

Für den Anfänger (wie es bei mir der Fall ist) ist es wirklich schwer zu verstehen, warum man beim Lesen der offiziellen Dokumentation in erster Linie Gurke verwendet. Vielleicht liegt es daran, dass die Dokumente implizieren, dass Sie den gesamten Zweck der Serialisierung bereits kennen. Erst nach dem Lesen des allgemeine Beschreibung der Serialisierung habe ich den Grund für dieses Modul und seine allgemeinen Anwendungsfälle verstanden. Auch umfassende Erklärungen zur Serialisierung ohne Berücksichtigung einer bestimmten Programmiersprache können hilfreich sein: https://stackoverflow.com/a/14482962/4383472 , Was ist Serialisierung? , https://stackoverflow.com/a/3984483/4383472

4
Bad

Pickle ist wie "Speichern unter ..." und "Öffnen ..." für Ihre Datenstrukturen und Klassen. Angenommen, ich möchte meine Datenstrukturen so speichern, dass sie zwischen den Programmläufen bestehen bleiben.

Speichern:

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

Wird geladen:

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

Jetzt muss ich myStuff nicht mehr von Grund auf neu erstellen und kann einfach dort weitermachen, wo ich aufgehört habe.

3
spartan

So fügen Sie ein Beispiel aus der Praxis hinzu: Das Dokumentationstool Sphinx für Python verwendet pickle, um geparste Dokumente und Querverweise zwischen Dokumenten zwischenzuspeichern, um nachfolgende Builds der zu beschleunigen Dokumentation.

2
lunaryorn

Ich kann Ihnen sagen, wofür ich es benutze und wozu es verwendet wurde:

  • Spielprofil wird gespeichert
  • Spieldaten retten Leben und Gesundheit
  • Frühere Aufzeichnungen von in ein Programm eingegebenen Sprichwörtern

Das sind die, für die ich es zumindest benutze

1
Austin Gummy

Ich verwende Beizen während des Web-Scrappings einer Website zu dieser Zeit. Ich möchte mehr als 8000.000 URLs speichern und sie so schnell wie möglich verarbeiten. Deshalb verwende ich Beizen, weil die Ausgabequalität sehr hoch ist.

sie können leicht auf die URL zugreifen und dort, wo Sie aufhören, sogar den Jobverzeichnisschlüssel. Word ruft auch die URL-Details sehr schnell ab, um den Vorgang fortzusetzen.

1
Divanshu Tak