Saya telah melihat dokumentasi acar , tetapi saya tidak mengerti di mana acar berguna.
Apa saja kasus penggunaan umum untuk acar?
Jawaban:
Beberapa kegunaan yang saya temukan:
1) menyimpan data status program ke disk sehingga dapat melanjutkan di tempat yang ditinggalkannya saat dimulai ulang (persistensi)
2) mengirim data python melalui koneksi TCP dalam sistem multi-core atau terdistribusi (marshalling)
3) menyimpan objek python dalam database
4) mengubah objek python menjadi string sehingga dapat digunakan sebagai kunci kamus (misalnya untuk caching & memoization).
Ada beberapa masalah dengan yang terakhir - dua objek identik dapat dijadikan acar dan menghasilkan string yang berbeda - atau bahkan objek yang sama yang diawetkan dua kali dapat memiliki representasi yang berbeda. Ini karena acar dapat menyertakan informasi jumlah referensi.
Untuk menekankan komentar @ lunaryorn - Anda tidak boleh melepaskan string dari sumber yang tidak tepercaya, karena acar yang dibuat dengan cermat dapat mengeksekusi kode arbitrer di sistem Anda. Misalnya lihat https://blog.nelhage.com/2011/03/exploiting-pickle/
Contoh perjalanan pulang pergi minimal ..
>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'
Sunting: tetapi untuk pertanyaan tentang contoh dunia nyata dari pengawetan, mungkin yang menggunakan paling maju dari pengawetan (Anda harus menggali cukup dalam ke sumber) adalah ZODB: http://svn.zope.org/
Jika tidak, PyPI menyebutkan beberapa: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
Saya pribadi telah melihat beberapa contoh objek acar yang dikirim melalui jaringan sebagai protokol transfer jaringan yang mudah digunakan.
Pengawetan mutlak diperlukan untuk komputasi terdistribusi dan paralel.
Katakanlah Anda ingin melakukan pengurangan peta paralel dengan multiprocessing
(atau di seluruh node cluster dengan pyina ), maka Anda perlu memastikan bahwa fungsi yang ingin Anda petakan di seluruh sumber daya paralel akan berubah. Jika tidak menjadi acar, Anda tidak dapat mengirimkannya ke sumber daya lain di proses lain, komputer, dll. Lihat juga di sini untuk contoh yang baik.
Untuk melakukan ini, saya menggunakan dill , yang dapat membuat serialisasi hampir semua hal dengan python. Dill juga memiliki beberapa alat yang bagus untuk membantu Anda memahami apa yang menyebabkan pengawetan Anda gagal saat kode Anda gagal.
Dan, ya, orang menggunakan picking untuk menyimpan status kalkulasi, atau sesi ipython Anda , atau apa pun.
Saya telah menggunakannya di salah satu proyek saya. Jika aplikasi dihentikan selama bekerja (ia melakukan tugas yang panjang dan memproses banyak data), saya perlu menyimpan seluruh struktur data dan memuatnya kembali setelah aplikasi dijalankan lagi. Saya menggunakan cPickle untuk ini, karena kecepatan adalah hal yang krusial dan ukuran datanya sangat besar.
Acar seperti "Save As .." dan "Open .." untuk struktur dan kelas data Anda. Katakanlah saya ingin menyimpan struktur data saya agar tetap ada di antara program yang dijalankan.
Penghematan:
with open("save.p", "wb") as f:
pickle.dump(myStuff, f)
Memuat:
try:
with open("save.p", "rb") as f:
myStuff = pickle.load(f)
except:
myStuff = defaultdict(dict)
Sekarang saya tidak perlu membangun myStuff dari awal lagi, dan saya bisa mengambil (le) dari bagian yang saya tinggalkan.
Untuk pemula (seperti halnya dengan saya) sangat sulit untuk memahami mengapa menggunakan acar ketika membaca dokumentasi resmi . Mungkin karena dokumen menyiratkan bahwa Anda sudah mengetahui seluruh tujuan serialisasi. Hanya setelah membaca gambaran umum serialisasi, saya memahami alasan modul ini dan kasus penggunaan umumnya. Juga penjelasan luas tentang serialisasi yang mengabaikan bahasa pemrograman tertentu dapat membantu: https://stackoverflow.com/a/14482962/4383472 , Apa itu serialisasi? , https://stackoverflow.com/a/3984483/4383472
Saya dapat memberi tahu Anda kegunaan saya menggunakannya dan telah melihatnya digunakan untuk:
Itulah yang setidaknya saya gunakan untuk itu
Saya menggunakan pengawetan selama pengikisan web salah satu situs web pada saat itu saya ingin menyimpan lebih dari 8000k url dan ingin memprosesnya secepat mungkin jadi saya menggunakan pengawet karena kualitas keluarannya sangat tinggi.
Anda dapat dengan mudah menjangkau ke url dan di mana Anda menghentikan bahkan kata kunci direktori pekerjaan juga mengambil detail url dengan sangat cepat untuk melanjutkan proses.