กรณีการใช้งานทั่วไปสำหรับดองใน Python


136

ฉันดูเอกสารของดองแล้ว แต่ฉันไม่เข้าใจว่าของดองมีประโยชน์ตรงไหน

การใช้ของดองมีอะไรบ้าง?


2
ส่วนที่ฉันไม่เข้าใจเกี่ยวกับการดองคือทำไมคุณไม่บันทึกค่าลงในไฟล์ล่ะ? ทำไมต้องดอง?
whackamadoodle3000

คำตอบ:


61

การใช้งานบางอย่างที่ฉันเจอ:

1) บันทึกข้อมูลสถานะของโปรแกรมลงในดิสก์เพื่อให้สามารถดำเนินการต่อจากจุดที่ค้างไว้เมื่อรีสตาร์ท (ความคงอยู่)

2) การส่งข้อมูล python ผ่านการเชื่อมต่อ TCP ในระบบมัลติคอร์หรือระบบกระจาย (marshalling)

3) การจัดเก็บวัตถุ python ในฐานข้อมูล

4) การแปลงอ็อบเจกต์ python โดยพลการเป็นสตริงเพื่อให้สามารถใช้เป็นคีย์พจนานุกรมได้ (เช่นการแคชและการบันทึก)

มีปัญหาบางประการเกี่ยวกับวัตถุชิ้นสุดท้าย - วัตถุที่เหมือนกันสองชิ้นสามารถดองได้และส่งผลให้มีสตริงที่แตกต่างกันหรือแม้แต่วัตถุชิ้นเดียวกันที่ดองสองครั้งอาจมีการแสดงที่แตกต่างกัน เนื่องจากการดองสามารถรวมข้อมูลการนับอ้างอิงได้

เพื่อเน้นย้ำความคิดเห็นของ @lunaryorn - คุณไม่ควรปลดสตริงจากแหล่งที่ไม่น่าเชื่อถือเนื่องจากผักดองที่สร้างขึ้นอย่างพิถีพิถันสามารถเรียกใช้รหัสโดยอำเภอใจในระบบของคุณได้ ตัวอย่างดูhttps://blog.nelhage.com/2011/03/exploiting-pickle/


27
ไม่ควรถ่ายโอนวัตถุดองผ่านเครือข่ายหรือช่องทางอื่น ๆ ที่ไม่น่าเชื่อถือเว้นแต่ข้อมูลที่ดองจะได้รับการป้องกันอย่างรอบคอบจากการจัดการ เอกสารดองอย่างชัดเจนเตือนเพื่อไม่ข้อมูล unpickle จากแหล่งที่ไม่น่าเชื่อถือหรือไม่ได้รับอนุญาต
lunaryorn

4
@lunaryorn: จุดดี. หากคุณกำลังจะถ่ายโอนข้อมูลดองระหว่างเครื่องให้ใช้ช่องทางที่ปลอดภัยเช่น SSL หรือ SSH tunneling
Dave Kirby

3
จากนั้นคุณยังคงไว้วางใจจุดสิ้นสุดที่จะไม่ใช้ประโยชน์จากคุณซึ่งอาจจะหรือไม่ก็ได้ขึ้นอยู่กับบริบท
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@lunaryorn - จุดดี แต่ในกรณีนั้นเราจะเข้ารหัสข้อมูลในโดเมนสาธารณะได้อย่างไร เราต้องใช้ py lib อื่น ๆ หรือไม่เพื่อใช้ดอง
Pardeep Sharma

จุดที่ 4) จริงหรือไม่? ฉันพบนี้ซึ่งมีบางส่วน (เดิม) หลักฐานที่แสดงว่าจะไม่ทำงานที่นี่
salotz

10

ตัวอย่างไปกลับน้อยที่สุด ..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

แก้ไข:แต่สำหรับคำถามเกี่ยวกับตัวอย่างการดองในโลกแห่งความเป็นจริงบางทีการใช้การดองขั้นสูงที่สุด (คุณต้องขุดลึกลงไปในแหล่งที่มา) คือ ZODB: http://svn.zope.org/

มิฉะนั้น PyPI จะกล่าวถึง: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

ฉันได้เห็นตัวอย่างของการดองหลายตัวอย่างเป็นการส่วนตัวที่ส่งผ่านเครือข่ายเป็นโปรโตคอลการถ่ายโอนเครือข่ายที่ใช้งานง่าย


8

การดองเป็นสิ่งที่จำเป็นอย่างยิ่งสำหรับการประมวลผลแบบกระจายและแบบขนาน

สมมติว่าคุณต้องการทำการลดแผนที่แบบขนานด้วยmultiprocessing(หรือข้ามโหนดคลัสเตอร์ด้วยpyina ) จากนั้นคุณต้องตรวจสอบให้แน่ใจว่าฟังก์ชันที่คุณต้องการแมปข้ามทรัพยากรแบบขนานจะถูกดอง ถ้ามันไม่ได้ดองคุณจะไม่สามารถส่งไปยังแหล่งข้อมูลอื่น ๆ เกี่ยวกับกระบวนการอื่นคอมพิวเตอร์ ฯลฯ นอกจากนี้โปรดดูที่นี่สำหรับเป็นตัวอย่างที่ดี

ในการทำเช่นนี้ฉันใช้ผักชีลาวซึ่งสามารถทำให้เป็นอนุกรมได้เกือบทุกอย่างใน python Dill ยังมีเครื่องมือที่ดีสำหรับช่วยให้คุณเข้าใจว่าอะไรเป็นสาเหตุให้การดองของคุณล้มเหลวเมื่อรหัสของคุณล้มเหลว

และใช่ผู้คนใช้การเลือกเพื่อบันทึกสถานะของการคำนวณหรือเซสชันipythonของคุณหรืออะไรก็ตาม


7

ฉันได้ใช้มันในโครงการหนึ่งของฉัน หากแอปถูกยุติในระหว่างที่ใช้งานได้ (มันทำงานที่ยาวและประมวลผลข้อมูลจำนวนมาก) ฉันจำเป็นต้องบันทึกโครงสร้างข้อมูลทั้งหมดและโหลดซ้ำหลังจากที่แอปทำงานอีกครั้ง ฉันใช้ cPickle สำหรับสิ่งนี้เนื่องจากความเร็วเป็นสิ่งสำคัญและขนาดของข้อมูลก็ใหญ่มาก


4

Pickle เปรียบเสมือน "บันทึกเป็น .. " และ "เปิด .. " สำหรับโครงสร้างข้อมูลและคลาสของคุณ สมมติว่าฉันต้องการบันทึกโครงสร้างข้อมูลของฉันเพื่อให้มันคงอยู่ระหว่างการรันโปรแกรม

ประหยัด:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

กำลังโหลด:

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

ตอนนี้ฉันไม่ต้องสร้าง myStuff ตั้งแต่เริ่มต้นอีกแล้วและฉันสามารถเลือก (le) จากจุดที่ฉันค้างไว้ได้


3

สำหรับการเริ่มต้น (เป็นกรณีที่มีฉัน) มันเป็นเรื่องยากที่จะเข้าใจว่าทำไมใช้ดองในสถานที่แรกเมื่ออ่านเอกสารอย่างเป็นทางการ อาจเป็นเพราะเอกสารบอกเป็นนัยว่าคุณรู้จุดประสงค์ทั้งหมดของการทำให้เป็นอนุกรมแล้ว หลังจากอ่านคำอธิบายทั่วไปของการทำให้เป็นอนุกรมฉันเข้าใจเหตุผลของโมดูลนี้และกรณีการใช้งานทั่วไปแล้ว นอกจากนี้ยังมีคำอธิบายในวงกว้างของอนุกรมไม่คำนึงถึงภาษาการเขียนโปรแกรมโดยเฉพาะอย่างยิ่งอาจช่วย https://stackoverflow.com/a/14482962/4383472 , อนุกรมคืออะไร? , https://stackoverflow.com/a/3984483/4383472


"คำตอบ" ของคุณไม่ใช่คำตอบ แต่เป็นความคิดเห็นมากกว่า คำถามของ OP คือ "อะไรคือกรณีการใช้งานทั่วไปสำหรับการดอง" คุณรู้สึกว่าคุณได้ตอบคำถามนั้นหรือไม่?
Mike McKerns

3
ดีฉันรู้สึกว่าฉันได้ตอบคำถามเพราะฉันยังมีความยากลำบากในการทำความเข้าใจการใช้งานร่วมกันของดองเมื่อฉันพยายามที่จะอ่านเกี่ยวกับโมดูลนี้ที่นี่ , ที่นี่และที่นี่ เพราะส่วนใหญ่พวกเขาเริ่มอธิบายสิ่งที่ดองโดยสมมติว่าคุณรู้แรงจูงใจที่อยู่เบื้องหลังแนวคิดทั้งหมดของการทำให้เป็นอนุกรม หลังจากที่ฉันอ่านบทความวิกิง่ายๆเกี่ยวกับการทำให้เป็นอนุกรมฉันก็เข้าใจแนวคิดทั่วไปรวมทั้ง "กรณีทั่วไป" บางทีมันอาจจะช่วยใครสักคนได้ ...
แย่

และบางกรณีที่พบบ่อยคือ ... ? หากมีบางส่วนที่ไม่ได้ระบุไว้ในคำตอบอื่น ๆ ... การเพิ่มเข้าไปในคำตอบของคุณจะเหมาะสมมาก
Mike McKerns

2

ในการเพิ่มตัวอย่างในโลกแห่งความเป็นจริง: เครื่องมือเอกสารSphinxสำหรับ Python ใช้การดองเพื่อแคชเอกสารที่แยกวิเคราะห์และการอ้างอิงข้ามระหว่างเอกสารเพื่อเร่งความเร็วในการสร้างเอกสารในภายหลัง


1

ฉันสามารถบอกคุณได้ว่าฉันใช้มันและเคยเห็นมันใช้สำหรับ:

  • โปรไฟล์เกมบันทึก
  • ข้อมูลเกมช่วยชีวิตและสุขภาพ
  • บันทึกก่อนหน้าของตัวเลขพูดที่ป้อนให้กับโปรแกรม

นี่คือสิ่งที่ฉันใช้เป็นอย่างน้อย


1

ฉันใช้การดองในระหว่างการทิ้งเว็บหนึ่งในเว็บไซต์ในเวลานั้นฉันต้องการจัดเก็บ URL มากกว่า 8000k และต้องการประมวลผลให้เร็วที่สุดดังนั้นฉันจึงใช้การดองเพราะคุณภาพผลผลิตสูงมาก

คุณสามารถเข้าถึง url ได้อย่างง่ายดายและตำแหน่งที่คุณหยุดแม้แต่คำสำคัญของไดเรกทอรีงานยังดึงรายละเอียด url ได้อย่างรวดเร็วเพื่อดำเนินการต่อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.