Yanıtlar:
Karşılaştığım bazı kullanımlar:
1) bir programın durum verilerini diske kaydedilir, böylece yeniden başlatıldığında kaldığı yerden devam edebilir (kalıcılık)
2) çok çekirdekli veya dağıtılmış bir sistemdeki bir TCP bağlantısı üzerinden python verisi gönderme (sıralama)
3) Python nesnelerini bir veritabanında saklamak
4) isteğe bağlı bir python nesnesini bir sözlük anahtarı olarak kullanılabilmesi için bir dizeye dönüştürmek (örn. Önbellekleme ve notlama için).
Sonuncusu ile ilgili bazı sorunlar var - iki özdeş nesne turşabilir ve farklı dizelerle sonuçlanabilir - veya iki kez turşusu yapılan aynı nesne bile farklı temsillere sahip olabilir. Bunun nedeni, turşunun referans sayısı bilgisini içermesidir.
@ Lunaryorn'un yorumunu vurgulamak için - özenle hazırlanmış bir turşu sisteminizde rasgele kod yürütebileceğinden, asla bir dizeyi güvenilmeyen bir kaynaktan seçmemelisiniz. Örneğin, bkz. Https://blog.nelhage.com/2011/03/exploiting-pickle/
Minimum gidiş dönüş örneği ..
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
Düzenleme: ama turşu gerçek dünya örnekleri sorusuna gelince, belki de en gelişmiş turşu kullanımı (kaynağa oldukça derin kazmak zorunda kalacaksınız) ZODB: http://svn.zope.org/
Aksi takdirde, PyPI birkaç kişiden bahseder: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
Kişisel olarak, ağ üzerinden kullanımı kolay bir ağ aktarım protokolü olarak gönderilen turşu nesnelerin birkaç örneğini gördüm.
Dağıtılmış ve paralel hesaplama için dekapaj kesinlikle gereklidir.
Diyelim ki multiprocessing
(veya pyina ile küme düğümleri arasında ) paralel bir harita azaltma yapmak istediğinizi varsa, paralel kaynaklar arasında eşlemek istediğiniz işlevin turşu olacağından emin olmanız gerekir. Turşu olmazsa, başka bir işlem, bilgisayar vb. Diğer kaynaklara gönderemezsiniz. Ayrıca iyi bir örnek için buraya bakın .
Bunu yapmak için , python'da neredeyse her şeyi serileştirebilen dereotu kullanıyorum . Dill ayrıca, kodunuz başarısız olduğunda dekapajınızın neyin başarısız olduğunu anlamanıza yardımcı olacak bazı iyi araçlara sahiptir .
Ve evet, insanlar bir hesaplamanın durumunu veya ipython oturumunuzu ya da her neyse kaydetmek için toplama özelliğini kullanır .
Projelerimden birinde kullandım. Uygulama çalışırken sona erdirildiyse (uzun bir görev yaptı ve çok sayıda veri işledi), tüm veri yapısını kaydetmem ve uygulama tekrar çalıştırıldıktan sonra yeniden yüklemem gerekiyordu. Bunun için cPickle kullandım, çünkü hız çok önemli bir şeydi ve veri boyutu gerçekten büyüktü.
Turşu, veri yapılarınız ve sınıflarınız için "Farklı Kaydet .." ve "Aç .." gibi. Diyelim ki veri yapılarımı program çalışmaları arasında kalıcı olacak şekilde kaydetmek istiyorum.
kaydetme:
with open("save.p", "wb") as f:
pickle.dump(myStuff, f)
Yükleniyor:
try:
with open("save.p", "rb") as f:
myStuff = pickle.load(f)
except:
myStuff = defaultdict(dict)
Şimdi myStuff'ı tekrar sıfırdan oluşturmak zorunda değilim ve bıraktığım yerden (le) alabilirim.
Yeni başlayanlar için (bende olduğu gibi) resmi belgeleri okurken neden ilk etapta turşu kullanıldığını anlamak gerçekten zor . Belki de bu dokümanlar serileştirmenin tüm amacını zaten bildiğinizi ima ediyor. Sadece serileştirmenin genel tanımını okuduktan sonra bu modülün nedenini ve ortak kullanım durumlarını anladım. Ayrıca belirli bir programlama dilini göz ardı ederek serileştirmenin geniş açıklamaları yardımcı olabilir: https://stackoverflow.com/a/14482962/4383472 , Serileştirme nedir? , https://stackoverflow.com/a/3984483/4383472
Bunun için kullandığım kullanımları söyleyebilirim ve bunun için kullanıldığını gördüm:
En azından benim kullandığım bunlar
Ben web sitesi bir web hurdaya sırasında dekapaj kullanıyorum o zaman 8000k url fazla saklamak istiyorum ve mümkün olduğunca hızlı işlemek istiyorum, böylece çıktı kalitesi çok yüksek olduğu için dekapaj kullanın.
kolayca url ulaşabilirsiniz ve hatta nerede iş dizini anahtar kelime durdurmak da url ayrıntılarını süreci devam etmek için çok hızlı getir.