2012-07-02 19 views
10

मैं अजगर प्रक्रियाओं के बीच स्मृति साझा करने का एक तरीका जानने का प्रयास कर रहा हूं। असल में ऐसे ऑब्जेक्ट्स मौजूद हैं जो मौजूद हैं कि एकाधिक पायथन प्रक्रियाओं को पढ़ने (केवल पढ़ने) और उपयोग (कोई उत्परिवर्तन) का उपयोग करने में सक्षम होना चाहिए। अभी इसे रेडिस + स्ट्रिंग्स + सीपीकल का उपयोग करके कार्यान्वित किया गया है, लेकिन सीपीकल ने बहुमूल्य CPU समय लिया है, इसलिए मैं इसका उपयोग नहीं करना चाहता हूं। अधिकांश पाइथन साझा किए गए मेमोरी कार्यान्वयन जिन्हें मैंने इंटर्ननेट पर देखा है, उन्हें फाइलों और अचार की आवश्यकता होती है जो मूल रूप से मैं पहले से ही कर रहा हूं और वास्तव में जो मैं टालने की कोशिश कर रहा हूं।पायथन प्रक्रियाओं के बीच साझा स्मृति

मुझे क्या सोच रहा है कि अगर ऐसा लिखने का कोई तरीका होगा ... मूल रूप से एक इन-मेमोरी पायथन ऑब्जेक्ट डेटाबेस/सर्वर और डेटाबेस के साथ इंटरफेस करने के लिए एक संबंधित सी मॉड्यूल?

मूल रूप से सी मॉड्यूल किसी ऑब्जेक्ट को किसी ऑब्जेक्ट को लिखने के लिए सर्वर से पूछता है, सर्वर किसी पते के साथ प्रतिक्रिया देगा, फिर मॉड्यूल ऑब्जेक्ट लिख देगा, और सर्वर को सूचित करेगा कि किसी दिए गए कुंजी वाले ऑब्जेक्ट को लिखा गया था निर्दिष्ट स्थान पर डिस्क पर। फिर जब कोई भी प्रक्रिया किसी ऑब्जेक्ट को किसी ऑब्जेक्ट को पुनर्प्राप्त करना चाहती थी तो वे केवल दी गई कुंजी के लिए स्मृति स्थान के लिए डीबी से पूछेंगे, सर्वर स्थान के साथ प्रतिक्रिया देगा और मॉड्यूल को पता होगा कि स्मृति में उस स्थान को कैसे लोड किया जाए और पाइथन ऑब्जेक्ट को पाइथन प्रक्रिया में वापस स्थानांतरित करें।

क्या यह पूरी तरह से अनुचित या वास्तव में लागू करने के लिए बहुत मुश्किल है? क्या मैं कुछ ऐसा करने का पीछा कर रहा हूं जो असंभव है? किसी भी सुझाव का स्वागत होगा। धन्यवाद इंटरनेट।

+1

वास्तव में आपका सीपीयू समय कितना मूल्यवान है कि यह एक ऐसे समाधान समाधान को डंप करने लायक है जो आपके द्वारा प्रस्तावित किए गए सिंक्रनाइज़ेशन को सिंक्रनाइज़ करने के लिए बहुत कम है? आप जो मांग रहे हैं वह किया जा सकता है लेकिन गधे में * सही * करने के लिए यह एक बड़ा दर्द होगा। – millimoose

+0

सीपीयू समय सबसे कीमती है। मूल रूप से unpickling वस्तुओं 20 एमएस (एक छोटे से के लिए) से 60 एमएस (एक बड़े के लिए) से कहीं भी ले जा सकते हैं। मैं व्यक्तिगत रूप से महसूस करता हूं कि इन दोनों समय बहुत लंबे हैं। संपादित करें: इस अर्थ में बहुत लंबा है कि एक बेहतर तरीका होना चाहिए, ऐसा नहीं है कि मुझे लगता है कि सीपीकल पर्याप्त मेहनत नहीं कर रहा है। – nickneedsaname

+0

साझाकरण मेमोरी करने योग्य होगा, लेकिन ऑब्जेक्ट्स साझा करना गंभीर रूप से कठिन होगा ... एक संबंधित प्रश्न यहां पाया जा सकता है: http://stackoverflow.com/questions/1268252/python-possible-to-share-in-memory-data -बेटवीन-2-अलग-प्रक्रियाओं (एलेक्स मार्टेलि का एक अच्छा लेखन है कि यह कड़ी मेहनत कर रहा है)। – ChristopheD

उत्तर

5

अनुचित नहीं है।

आईपीसी मेमोरी मैप की गई फ़ाइल के साथ किया जा सकता है। अजगर में बनाया कार्यक्षमता है:

http://docs.python.org/library/mmap.html

बस दोनों प्रक्रियाओं में फ़ाइल और हे-Presto mmap आप एक साझा फ़ाइल है। बेशक आपको यह देखने के लिए दोनों प्रक्रियाओं में इसे मतदान करना होगा कि क्या परिवर्तन हैं। और आपको दोनों के बीच लिखना सह-संचालन करना होगा। और तय करें कि आप अपना डेटा किस प्रारूप में रखना चाहते हैं। लेकिन यह आपकी समस्या का एक आम समाधान है।

+6

लेकिन फिर भी इसे बाइट्स को क्रमबद्ध करने की आवश्यकता होगी, हां? ओपी ने कहा कि वह इससे बचने की कोशिश कर रहा था। –

+0

यह किसी प्रकार का क्रमिकरण होगा, हां। ऑब्जेक्ट प्रकार ज्ञात होने पर शायद कस्टम सीरियलाइजेशन बेहतर काम करेगा। वैकल्पिक रूप से किसी ऑब्जेक्ट को फिर से deserialising से बचने के लिए एक हैश कोड शामिल हैं। हालांकि यह किया जाता है, serialization की आवश्यकता है। – Joe

+0

कोई क्रमबद्धता :( – nickneedsaname

3

यदि आप पिकलिंग नहीं चाहते हैं, तो multiprocessing.sharedctypes फिट हो सकता है। यह थोड़ा कम स्तर है, यद्यपि; आपको निर्दिष्ट मानों के एकल मान या सरणी मिलती हैं।

बाल प्रक्रियाओं (डेटा) में डेटा वितरित करने का एक और तरीका multiprocessing.Pipe है। यह पाइथन ऑब्जेक्ट्स को संभाल सकता है, और इसे सी में लागू किया गया है, इसलिए मैं आपको यह नहीं बता सकता कि यह पिकलिंग का उपयोग करता है या नहीं।

संबंधित मुद्दे