निम्नलिखित कोड प्रक्रियाओं में यूनिकोड स्ट्रिंग की एक बड़ी श्रृंखला साझा करने के लिए 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!)
क्यों?
नहीं प्रश्न का उत्तर .... – papercrane
और अजीब है, यह काम करते हैं, कम से कम अपने परीक्षण में, और अजगर वस्तु माता-पिता और बच्चों में बहुत कम स्मृति में बहुत अधिक स्मृति का उपयोग किया गया है। इस प्रश्न का उत्तर जानना अभी भी दिलचस्प होगा। – papercrane