Kasus penggunaan umum untuk acar dengan Python

136

Saya telah melihat dokumentasi acar , tetapi saya tidak mengerti di mana acar berguna.

Apa saja kasus penggunaan umum untuk acar?

satoru
sumber
2
Bagian yang saya tidak mengerti tentang pengawetan adalah mengapa Anda tidak menyimpan nilainya ke file? Mengapa acar itu?
whackamadoodle3000

Jawaban:

61

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/

Dave Kirby
sumber
27
Seseorang tidak boleh mentransfer objek acar melalui jaringan atau saluran tidak tepercaya lainnya, kecuali data acar diamankan dengan hati-hati dari manipulasi. Dokumentasi acar secara eksplisit memperingatkan untuk tidak pernah melepaskan data dari sumber yang tidak tepercaya atau tidak terautentikasi.
lunaryorn
4
@ Lunaryorn: poin yang bagus. Jika Anda akan mentransfer data acar antar mesin, gunakan saluran aman seperti SSL atau tunneling SSH.
Dave Kirby
3
Maka Anda masih mempercayai titik akhir untuk tidak mengeksploitasi Anda, yang mungkin baik-baik saja atau tidak, tergantung pada konteksnya.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
@lunaryorn - poin yang bagus tetapi dalam hal ini bagaimana kita bisa mengenkripsi data di domain publik. apakah kita harus menggunakan py lib lain atau tidak menggunakan acar
Pardeep Sharma
Apakah poin 4) benar? Saya menemukan ini yang memiliki beberapa bukti (lama) yang tidak akan berfungsi di sini .
salotz
10

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.

Jacob Oscarson
sumber
8

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.

Mike McKerns
sumber
7

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.

taskinoor.dll
sumber
4

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.

sederhana
sumber
3

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

Buruk
sumber
"jawaban" Anda bukanlah jawaban, ini lebih merupakan komentar. Pertanyaan OP adalah "Apa saja kasus penggunaan umum untuk acar?". Apakah Anda merasa telah menjawab pertanyaan itu dengan cara apa pun?
Mike McKerns
3
Nah, saya merasa telah menjawab pertanyaan tersebut karena saya juga mengalami kesulitan untuk memahami kegunaan umum acar ketika saya mencoba membaca tentang modul ini disini , disini dan disini . Karena kebanyakan mereka mulai menjelaskan apa yang dilakukan acar dengan asumsi Anda tahu motivasi di balik seluruh konsep serialisasi. Setelah saya membaca artikel wiki sederhana tentang serialisasi, saya memahami gagasan umum serta "kasus umum". Mungkin itu akan membantu seseorang ...
Buruk
dan beberapa dari kasus umum tersebut adalah…? Jika ada beberapa yang tidak tercantum di sini dalam jawaban lain… menambahkannya ke jawaban Anda akan sangat tepat.
Mike McKerns
2

Untuk menambahkan contoh dunia nyata: Alat dokumentasi Sphinx untuk Python menggunakan acar untuk menyimpan cache dokumen yang diurai dan referensi silang antar dokumen, untuk mempercepat pembuatan dokumentasi berikutnya.

lunaryorn
sumber
1

Saya dapat memberi tahu Anda kegunaan saya menggunakannya dan telah melihatnya digunakan untuk:

  • Profil permainan disimpan
  • Data game menyelamatkan seperti nyawa dan kesehatan
  • Rekaman sebelumnya dari angka katakan yang dimasukkan ke program

Itulah yang setidaknya saya gunakan untuk itu

Austin Gummy
sumber
1

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.

Divanshu Tak
sumber