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?
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?
Antworten:
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/
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.
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 .
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.
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.
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
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.
Ich kann Ihnen sagen, für welche Zwecke ich es verwende und wie ich es verwendet habe:
Das sind diejenigen, für die ich es zumindest benutze
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.