ฉันดูเอกสารของดองแล้ว แต่ฉันไม่เข้าใจว่าของดองมีประโยชน์ตรงไหน
การใช้ของดองมีอะไรบ้าง?
ฉันดูเอกสารของดองแล้ว แต่ฉันไม่เข้าใจว่าของดองมีประโยชน์ตรงไหน
การใช้ของดองมีอะไรบ้าง?
คำตอบ:
การใช้งานบางอย่างที่ฉันเจอ:
1) บันทึกข้อมูลสถานะของโปรแกรมลงในดิสก์เพื่อให้สามารถดำเนินการต่อจากจุดที่ค้างไว้เมื่อรีสตาร์ท (ความคงอยู่)
2) การส่งข้อมูล python ผ่านการเชื่อมต่อ TCP ในระบบมัลติคอร์หรือระบบกระจาย (marshalling)
3) การจัดเก็บวัตถุ python ในฐานข้อมูล
4) การแปลงอ็อบเจกต์ python โดยพลการเป็นสตริงเพื่อให้สามารถใช้เป็นคีย์พจนานุกรมได้ (เช่นการแคชและการบันทึก)
มีปัญหาบางประการเกี่ยวกับวัตถุชิ้นสุดท้าย - วัตถุที่เหมือนกันสองชิ้นสามารถดองได้และส่งผลให้มีสตริงที่แตกต่างกันหรือแม้แต่วัตถุชิ้นเดียวกันที่ดองสองครั้งอาจมีการแสดงที่แตกต่างกัน เนื่องจากการดองสามารถรวมข้อมูลการนับอ้างอิงได้
เพื่อเน้นย้ำความคิดเห็นของ @lunaryorn - คุณไม่ควรปลดสตริงจากแหล่งที่ไม่น่าเชื่อถือเนื่องจากผักดองที่สร้างขึ้นอย่างพิถีพิถันสามารถเรียกใช้รหัสโดยอำเภอใจในระบบของคุณได้ ตัวอย่างดูhttps://blog.nelhage.com/2011/03/exploiting-pickle/
ตัวอย่างไปกลับน้อยที่สุด ..
>>> 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
ฉันได้เห็นตัวอย่างของการดองหลายตัวอย่างเป็นการส่วนตัวที่ส่งผ่านเครือข่ายเป็นโปรโตคอลการถ่ายโอนเครือข่ายที่ใช้งานง่าย
การดองเป็นสิ่งที่จำเป็นอย่างยิ่งสำหรับการประมวลผลแบบกระจายและแบบขนาน
สมมติว่าคุณต้องการทำการลดแผนที่แบบขนานด้วยmultiprocessing
(หรือข้ามโหนดคลัสเตอร์ด้วยpyina ) จากนั้นคุณต้องตรวจสอบให้แน่ใจว่าฟังก์ชันที่คุณต้องการแมปข้ามทรัพยากรแบบขนานจะถูกดอง ถ้ามันไม่ได้ดองคุณจะไม่สามารถส่งไปยังแหล่งข้อมูลอื่น ๆ เกี่ยวกับกระบวนการอื่นคอมพิวเตอร์ ฯลฯ นอกจากนี้โปรดดูที่นี่สำหรับเป็นตัวอย่างที่ดี
ในการทำเช่นนี้ฉันใช้ผักชีลาวซึ่งสามารถทำให้เป็นอนุกรมได้เกือบทุกอย่างใน python Dill ยังมีเครื่องมือที่ดีสำหรับช่วยให้คุณเข้าใจว่าอะไรเป็นสาเหตุให้การดองของคุณล้มเหลวเมื่อรหัสของคุณล้มเหลว
และใช่ผู้คนใช้การเลือกเพื่อบันทึกสถานะของการคำนวณหรือเซสชันipythonของคุณหรืออะไรก็ตาม
ฉันได้ใช้มันในโครงการหนึ่งของฉัน หากแอปถูกยุติในระหว่างที่ใช้งานได้ (มันทำงานที่ยาวและประมวลผลข้อมูลจำนวนมาก) ฉันจำเป็นต้องบันทึกโครงสร้างข้อมูลทั้งหมดและโหลดซ้ำหลังจากที่แอปทำงานอีกครั้ง ฉันใช้ cPickle สำหรับสิ่งนี้เนื่องจากความเร็วเป็นสิ่งสำคัญและขนาดของข้อมูลก็ใหญ่มาก
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) จากจุดที่ฉันค้างไว้ได้
สำหรับการเริ่มต้น (เป็นกรณีที่มีฉัน) มันเป็นเรื่องยากที่จะเข้าใจว่าทำไมใช้ดองในสถานที่แรกเมื่ออ่านเอกสารอย่างเป็นทางการ อาจเป็นเพราะเอกสารบอกเป็นนัยว่าคุณรู้จุดประสงค์ทั้งหมดของการทำให้เป็นอนุกรมแล้ว หลังจากอ่านคำอธิบายทั่วไปของการทำให้เป็นอนุกรมฉันเข้าใจเหตุผลของโมดูลนี้และกรณีการใช้งานทั่วไปแล้ว นอกจากนี้ยังมีคำอธิบายในวงกว้างของอนุกรมไม่คำนึงถึงภาษาการเขียนโปรแกรมโดยเฉพาะอย่างยิ่งอาจช่วย https://stackoverflow.com/a/14482962/4383472 , อนุกรมคืออะไร? , https://stackoverflow.com/a/3984483/4383472
ในการเพิ่มตัวอย่างในโลกแห่งความเป็นจริง: เครื่องมือเอกสารSphinxสำหรับ Python ใช้การดองเพื่อแคชเอกสารที่แยกวิเคราะห์และการอ้างอิงข้ามระหว่างเอกสารเพื่อเร่งความเร็วในการสร้างเอกสารในภายหลัง
ฉันสามารถบอกคุณได้ว่าฉันใช้มันและเคยเห็นมันใช้สำหรับ:
นี่คือสิ่งที่ฉันใช้เป็นอย่างน้อย
ฉันใช้การดองในระหว่างการทิ้งเว็บหนึ่งในเว็บไซต์ในเวลานั้นฉันต้องการจัดเก็บ URL มากกว่า 8000k และต้องการประมวลผลให้เร็วที่สุดดังนั้นฉันจึงใช้การดองเพราะคุณภาพผลผลิตสูงมาก
คุณสามารถเข้าถึง url ได้อย่างง่ายดายและตำแหน่งที่คุณหยุดแม้แต่คำสำคัญของไดเรกทอรีงานยังดึงรายละเอียด url ได้อย่างรวดเร็วเพื่อดำเนินการต่อ