2012-02-16 5 views
7

निम्नलिखित कोड प्रक्रियाओं में यूनिकोड स्ट्रिंग की एक बड़ी श्रृंखला साझा करने के लिए multiprocessing के Array का उपयोग करता है। यदि मैं c_wchar_p प्रकार के रूप में उपयोग करता हूं, तो बाल प्रक्रिया 'स्मृति उपयोग माता-पिता प्रक्रिया में उपयोग की जाने वाली लगभग एक चौथाई मेमोरी है (अगर मैं ऐरे में प्रविष्टियों की मात्रा बदलता हूं तो राशि बदलती है)।एक ctypes साझा करते समय एक बच्चे (पायथन मल्टीप्रोसेसिंग) प्रक्रिया का स्मृति उपयोग इतना अलग क्यों होता है। स्ट्रिंग बनाम केवल एक स्ट्रिंग के साथ संरचना?

हालांकि, अगर मैं फ़ील्ड के साथ ctypes.Structure का उपयोग करता हूं तो बच्चे की प्रक्रिया 'स्मृति उपयोग निरंतर और बहुत कम है जबकि मूल प्रक्रिया' स्मृति उपयोग युगल है। इस उत्पादन में

363224k memory used in parent: unicode 0! 
72560k memory used in child 5: unicode 5! 
72556k memory used in child 3: unicode 3! 
72536k memory used in child 1: unicode 1! 
72568k memory used in child 4: unicode 4! 
72576k memory used in child 2: unicode 2! 

का उपयोग करते हुए रिकार्ड परिणाम::

import ctypes 
import multiprocessing 
import random 
import resource 
import time 

a = None 

class Record(ctypes.Structure): 
    _fields_ = [('value', ctypes.c_wchar_p)] 
    def __init__(self, value): 
     self.value = value 

    def __str__(self): 
     return '(%s)' % (self.value,) 

def child(i): 
    while True: 
     print "%ik memory used in child %i: %s" % (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024, i, a[i]) 
     time.sleep(1) 
     for j in xrange(len(a)): 
      c = a[j] 

def main(): 
    global a 
    # uncomment this line and comment the next to switch 
    #a = multiprocessing.Array(ctypes.c_wchar_p, [u'unicode %r!' % i for i in xrange(1000000)], lock=False) 
    a = multiprocessing.Array(Record, [Record(u'unicode %r!' % i) for i in xrange(1000000)], lock=False) 
    for i in xrange(5): 
     p = multiprocessing.Process(target=child, args=(i + 1,)) 
     p.start() 
    while True: 
     print "%ik memory used in parent: %s" % (resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024, a[0]) 
     time.sleep(1) 

if __name__ == '__main__': 
    main() 

इस उत्पादन में c_wchar_p परिणाम का उपयोग करना

712508k memory used in parent: (unicode 0!) 
1912k memory used in child 1: (unicode 1!) 
1908k memory used in child 2: (unicode 2!) 
1904k memory used in child 5: (unicode 5!) 
1904k memory used in child 4: (unicode 4!) 
1908k memory used in child 3: (unicode 3!) 

क्यों?

उत्तर

2

मैं स्मृति के उपयोग में वृद्धि के बारे में पता नहीं है, लेकिन मुझे नहीं लगता कि यह वास्तव में क्या कर रही है तुम क्या करने का इरादा क्या है।

आप अपने माता पिता की प्रक्रिया में a[i] संशोधित करते हैं, बच्चे प्रक्रियाओं एक ही मूल्य नहीं मिलता है।

यह (जो वास्तव में _p प्रकार क्या हैं) प्रक्रियाओं के बीच संकेत पारित करने के लिए नहीं सबसे अच्छा है। multiprocessing डॉक्स से उद्धृत के रूप में:

हालांकि यह संभव है साझा स्मृति में एक सूचक स्टोर करने के लिए याद रखें कि यह एक विशिष्ट प्रक्रिया के पता स्थान में एक स्थान के पास भेजेगा। हालांकि, दूसरी प्रक्रिया के संदर्भ में पॉइंटर काफी अमान्य होने की संभावना है और दूसरी प्रक्रिया से पॉइंटर को अपमानित करने का प्रयास करने से क्रैश हो सकता है।

+0

नहीं प्रश्न का उत्तर .... – papercrane

+0

और अजीब है, यह काम करते हैं, कम से कम अपने परीक्षण में, और अजगर वस्तु माता-पिता और बच्चों में बहुत कम स्मृति में बहुत अधिक स्मृति का उपयोग किया गया है। इस प्रश्न का उत्तर जानना अभी भी दिलचस्प होगा। – papercrane

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