2015-02-17 5 views
10

मेरे पास एक पाइथन प्रक्रिया है जो WSGI-apache सर्वर के रूप में कार्यरत है। मेरे पास इस प्रक्रिया की कई प्रतियां कई मशीनों पर चल रही हैं। मेरी प्रक्रिया के बारे में 200 मेगाबाइट केवल पढ़ने के लिए पाइथन डेटा है। मैं इन आंकड़ों को स्मृति-मैप किए गए सेगमेंट में रखना चाहता हूं ताकि प्रक्रियाएं उन डेटा की एक प्रति साझा कर सकें। बेस्ट उन आंकड़ों के संलग्न करने के लिए सक्षम होने के लिए हो सकता है ताकि वे वास्तविक अजगर 2.7 डेटा वस्तुओं के बजाय उन्हें अचार या डी बी एम या SQLite तरह कुछ से बाहर पार्स करने से हो सकता है जाएगा।साझा स्मृति में आसानी से पाइथन उपयोग करने योग्य पढ़ने-योग्य डेटा संरचनाओं को कैसे संग्रहीत करें

किसी को भी एक परियोजना है कि यह किया गया है साझा करने के लिए करने के लिए नमूना कोड या संकेत है?

+0

"मेरी प्रक्रिया के लगभग 200 मेगाबाइट केवल पढ़ने वाले पायथन डेटा हैं।" मैं इस हिस्से को समझ नहीं पाया। क्या आप कुछ विवरण दे सकते हैं? क्या डेटा प्रकार? आपने क्या प्रयास किया –

+1

आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं, और आपकी प्रक्रियाओं को कैसे रोक रहे हैं?यदि आप 'vfork' का उपयोग कर रहे हैं तो बच्चा अपने माता-पिता के पृष्ठों की प्रतिलिपि साझा करता है जब तक कि वह उन्हें वैसे भी लिखता न हो। –

+0

रेडिस का उपयोग क्यों नहीं करेंगे आपकी समस्या का समाधान? –

उत्तर

1

चूंकि यह केवल पढ़ने के लिए डेटा है, आपको प्रक्रियाओं के बीच कोई भी अपडेट साझा करने की आवश्यकता नहीं होगी (क्योंकि कोई अपडेट नहीं होगा) मैं प्रस्तावित करता हूं कि आप प्रत्येक प्रक्रिया में इसकी स्थानीय प्रतिलिपि रखें।

स्मृति की कमी एक मुद्दा आप multiprocessing.Value या multiprocessing.Array का उपयोग कर इस बात के लिए ताले के बिना पर एक नज़र हो सकता है: https://docs.python.org/2/library/multiprocessing.html#shared-ctypes-objects

उसके अलावा आप एक बाहरी प्रक्रिया पर भरोसा करना होगा और कुछ इस किया पाने के लिए serialising , अगर मैं आप थे तो मैं रेडिस या मेमकैच पर एक नज़र डालेगा।

3

This post स्टैक ओवरव्लो पर @modelnine द्वारा इस प्रश्न का वास्तव में एक बड़ा व्यापक उत्तर प्रदान करता है। जैसा कि उन्होंने उल्लेख किया है, आपके वेबसर्वर में प्रक्रिया-फोर्किंग की बजाय धागे का उपयोग करके इसका प्रभाव काफी कम हो सकता है। कुछ वर्षों पहले कुछ प्रकार की साझा मेमोरी का उपयोग करते हुए सीएलआई पायथन प्रक्रियाओं के बीच ran into a similar problem trying to share extremely-large NumPy arrays, और हमने श्रमिकों के बीच डेटा साझा करने के लिए sharedmem पायथन एक्सटेंशन के संयोजन का उपयोग करके समाप्त किया (जो कुछ मामलों में स्मृति को रिसाव साबित करता है, लेकिन, यह ठीक करने योग्य है शायद)। एक केवल पढ़ने के लिए mmap() तकनीक आप के लिए काम कर सकते हैं, लेकिन मैं ऐसा करने के लिए कैसे शुद्ध अजगर में यकीन नहीं है (NumPy एक memmapping तकनीक समझाया here है)। मुझे इस प्रश्न का कोई स्पष्ट और सरल जवाब कभी नहीं मिला है, लेकिन उम्मीद है कि यह आपको कुछ नए दिशाओं में इंगित कर सकता है। हमें बताएं कि आप क्या कर रहे हैं!

1

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

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

1

यह वास्तविक अजगर वस्तुओं साझा करने के लिए, क्योंकि वे प्रक्रिया पता स्थान के लिए बाध्य कर रहे हैं मुश्किल है। हालांकि, अगर आप mmap का उपयोग करते हैं, तो आप बहुत उपयोगी साझा ऑब्जेक्ट्स बना सकते हैं। मैं डेटा को प्री-लोड करने के लिए एक प्रक्रिया तैयार करूंगा, और शेष इसका उपयोग कर सकते हैं। मुझे काफी अच्छा ब्लॉग पोस्ट मिला जो वर्णन करता है कि यह कैसे किया जा सकता है: http://blog.schmichael.com/2011/05/15/sharing-python-data-between-processes-using-mmap/

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