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

134

Ich habe mir die Dokumentation zu Gurken angesehen , aber ich verstehe nicht, wo Gurken nützlich sind.

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

Satoru
quelle
2
Der Teil, den ich beim Beizen nicht verstehe, ist, warum Sie den Wert nicht einfach in einer Datei speichern. Warum es einlegen?
Whackamadoodle3000

Antworten:

59

Einige Anwendungen, 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 Multi-Core- oder verteilten System (Marshalling)

3) Speichern von Python-Objekten in einer Datenbank

4) Konvertieren eines beliebigen Python-Objekts in eine Zeichenfolge, damit es als Wörterbuchschlüssel verwendet werden kann (z. B. zum Zwischenspeichern und Speichern).

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

Um den Kommentar von @ lunaryorn hervorzuheben: Sie sollten niemals einen String aus einer nicht vertrauenswürdigen Quelle entfernen, da ein sorgfältig ausgearbeitetes Pickle beliebigen Code auf Ihrem System ausführen kann. Siehe zum Beispiel https://blog.nelhage.com/2011/03/exploiting-pickle/

Dave Kirby
quelle
27
Eingelegte Objekte sollten nicht über ein Netzwerk oder andere nicht vertrauenswürdige Kanäle übertragen werden, es sei denn, die eingelegten Daten sind sorgfältig gegen Manipulationen geschützt. Die Beize Dokumentation warnt ausdrücklich nie unpickle Daten aus nicht vertrauenswürdigen oder nicht authentifizierten Quellen.
Mondhorn
4
@ Mondorn: guter Punkt. Wenn Sie eingelegte Daten zwischen Computern übertragen möchten, verwenden Sie einen sicheren Kanal wie SSL- oder SSH-Tunneling.
Dave Kirby
3
Dann vertrauen Sie immer noch darauf, dass der Endpunkt Sie nicht ausnutzt, was je nach Kontext in Ordnung sein kann oder nicht.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
@unaryorn - guter Punkt, aber in diesem Fall, wie können wir Daten in Public Domain verschlüsseln.
Müssen
Ist Punkt 4) wahr? Ich fand diese , die einige (alt) Beweise haben , die nicht funktionieren würde hier .
Salotz
10

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'

Bearbeiten: Aber was die Frage der Beispiele für das Beizen in der Praxis betrifft, so ist ZODB: http://svn.zope.org/ die vielleicht am weitesten fortgeschrittene Verwendung des Beizens (Sie müssten ziemlich tief in die Quelle eintauchen).

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

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

Jacob Oscarson
quelle
8

Beizen ist für verteiltes und paralleles Rechnen unbedingt erforderlich.

Angenommen , Sie möchten eine parallele Kartenreduzierung mit multiprocessing(oder über Clusterknoten mit Pyina ) durchführen, dann müssen Sie sicherstellen, dass die Funktion, die Sie über die parallelen Ressourcen hinweg zuordnen möchten , aktiviert wird. Wenn es nicht beizen, können Sie es nicht zu den anderen Ressourcen auf einem anderen Prozess, Computer senden, usw. Siehe auch hier für ein gutes Beispiel.

Dazu verwende ich Dill , der fast alles in Python serialisieren kann. Dill hat auch einige gute Tools, die Ihnen helfen, zu verstehen, warum Ihr Beizen fehlschlägt, wenn Ihr Code fehlschlägt.

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

Mike McKerns
quelle
7

Ich habe es in einem meiner Projekte verwendet. Wenn die App während der Arbeit beendet wurde (sie hat eine lange Aufgabe erledigt und 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 Geschwindigkeit eine entscheidende Rolle spielte und die Datenmenge sehr groß war.

taskinoor
quelle
4

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 noch einmal von Grund auf neu erstellen, und ich kann einfach (le) dort weitermachen, wo ich aufgehört habe.

spartanisch
quelle
3

Für den Anfänger (wie es bei mir der Fall ist) ist es wirklich schwer zu verstehen, warum beim Lesen der offiziellen Dokumentation überhaupt Gurke verwendet wird . Vielleicht liegt es daran, dass die Dokumente implizieren, dass Sie den gesamten Zweck der Serialisierung bereits kennen. Erst nachdem ich die allgemeine Beschreibung der Serialisierung gelesen habe, habe ich den Grund für dieses Modul und seine häufigen 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

Schlecht
quelle
Ihre "Antwort" ist keine Antwort, sondern eher ein Kommentar. Die Frage des OP lautet: "Was sind einige häufige Anwendungsfälle für Gurken?". Haben Sie das Gefühl, diese Frage in irgendeiner Weise beantwortet zu haben?
Mike McKerns
3
Nun, ich habe das Gefühl, dass ich die Frage beantwortet habe, weil ich auch Schwierigkeiten hatte, die üblichen Verwendungszwecke von Gurke zu verstehen, als ich versuchte, hier , hier und hier über dieses Modul zu lesen . Denn meistens beginnen sie zu erklären, was Gurke tut, vorausgesetzt, Sie kennen die Motivation hinter dem gesamten Konzept der Serialisierung. Nachdem ich einen einfachen Wiki-Artikel über Serialisierung gelesen hatte, verstand ich die allgemeine Idee sowie "häufige Fälle". Vielleicht hilft es jemandem ...
Bad
und einige dieser häufigen Fälle sind…? Wenn es einige gibt, die hier nicht in anderen Antworten aufgeführt sind, wäre es sehr angemessen, sie zu Ihrer Antwort hinzuzufügen.
Mike McKerns
2

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

Mondhorn
quelle
1

Ich kann Ihnen sagen, für welche Zwecke ich es verwende und wie ich es verwendet habe:

  • Spielprofil speichert
  • Spieldaten retten Leben und Gesundheit
  • Frühere Aufzeichnungen von beispielsweise in ein Programm eingegebenen Nummern

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

Austin Gummy
quelle
1

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

Sie können leicht zur URL gelangen und dort, wo Sie sogar das Schlüsselwort des Jobverzeichnisses stoppen, auch sehr schnell URL-Details abrufen, um den Vorgang fortzusetzen.

Divanshu Tak
quelle