2015-08-22 17 views
5

में विभिन्न प्रक्रियाओं के बीच बड़ी वस्तु साझा करना मैं मेमोरी उपयोग को कम करने के लिए पाइथन में विभिन्न प्रक्रियाओं के बीच एक बड़ी वस्तु (~ 2 जीबी) साझा करने की कोशिश कर रहा हूं। मैंने मल्टीप्रोसेसिंग लाइब्रेरी में प्रबंधक वर्ग और प्रॉक्सी के बारे में सीखा है (https://docs.python.org/3.4/library/multiprocessing.html#multiprocessing-managers)। हालांकि, दस्तावेज़ीकरण और अन्य स्टैक ओवरफ्लो उपयोगकर्ताओं के अनुसार, यह बहुत धीमी हो सकती है जब इसका उपयोग इस तरह की बड़ी वस्तुओं पर किया जाता है। क्या यह सही है, और यदि हां, तो क्या कोई और तेज पायथन लाइब्रेरी या फ़ंक्शन है जिसका मैं उपयोग कर सकता हूं? धन्यवाद।पायथन 3.4

संपादित करें: मैंने जो वस्तु बनाई है वह एक डीएजी (निर्देशित विश्वकोश ग्राफ) है जिसका कन्स्ट्रक्टर मानक पायथन मूल्यों के होते हैं, हालांकि।

+1

"शेयर" से आपका क्या मतलब है - पढ़ना या उत्परिवर्तन करना? – FMc

+0

मेरा मतलब है पढ़ना। मैं वस्तु को किसी भी तरह से नहीं बदल रहा हूं। –

+0

क्या आपने mmap को देखा है? –

उत्तर

1

यदि आपका डेटा मानक मानों और सरणीओं (कोई अन्य पायथन ऑब्जेक्ट्स) तक सीमित नहीं है, तो आप साझा मेमोरी (वैल्यू() और ऐरे() का उपयोग कर सकते हैं, https://docs.python.org/3.4/library/multiprocessing.html#shared-ctypes-objects देखें)। यह बहुत तेज़ है।

+0

स्पष्टीकरण के लिए खेद है, लेकिन यह एक उपयोगकर्ता परिभाषित वस्तु है, जिसका निर्माता मानक पायथन मूल्यों के बावजूद है। क्या यह अभी भी इस मामले में काम करेगा? –

+0

ऐसा लगता है कि यह काम करता है, क्योंकि मेरे उपयोगकर्ता द्वारा परिभाषित ऑब्जेक्ट निश्चित रूप से एक प्रकार का ऑब्जेक्ट नहीं है। –

1

समस्या का एक समाधान को एक प्रोसेसस ग्राफ़ बनाना है जो प्रॉक्सी का उपयोग करके अन्य प्रक्रियाओं से निष्पादित विधियों का खुलासा करता है। इसका मतलब है कि आपको manager.dict और manager.value पर एक समान श्रेणी बनाना है। यह एक निर्माता/उपभोक्ता पैटर्न के माध्यम से किया जाता है। इसे इंटर प्रोसेस कॉल (आईपीसी) या रिमोट प्रोसेस कॉल (आरपीसी) कहा जाता है। समाधान में zeroless या pyro शामिल हो सकता है।

एक और समाधान, कि एक अन्य समाधान एक डेटाबेस का उपयोग करने के लिए है सरल

है। उदाहरण के लिए, bsddb या lmdb जो कम से कम मल्टीप्रोसेसस को डेटाबेस तक पहुंच पढ़ने का समर्थन करता है। ajgu या the simpler design का उपयोग करना। आपको बहुत सारे कोड लिखने से बचा सकता है।

अंतिम समाधान, एक फ़ाइल बनाने के लिए है जिसे आप स्मृति में mmap और उनके से पढ़ते हैं। लेकिन यह वास्तव में एक समाधान है जो आपके ग्राफ को पढ़ा जाता है क्योंकि यदि आप ग्राफ को संशोधित करने की अपेक्षा करते हैं तो आपको एक mmap'ed ग्राफ डेटाबेस लिखना शुरू करना होगा। यह पूरी तरह से स्मृति में होने का लाभ है।

  • एक डेटाबेस
  • एक अन्य वर्ग है कि विभिन्न से ग्राफ का उपयोग करेगा बनाने के लिए:

    मेरे सिफारिश lmdb उपयोग करने के लिए दो स्क्रिप्ट के साथ एक ग्राफ डेटाबेस ajgu का सरल संस्करण से उदाहरण लेने का निर्माण करना है प्रक्रिया।

+0

अगर मैं इसके बारे में चर्चा करना चाहता हूं तो मैं अजूगुडीबी का मैनेनर हूं [इसके नए फोर्ज] (https://github.com/amirouche/AjguDB) – amirouche

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