मैं एक कार्यक्रम निम्नानुसार संक्षेप किया जा सकता है कि लिखा है:अजगर बहु स्मृति उपयोग
def loadHugeData():
#load it
return data
def processHugeData(data, res_queue):
for item in data:
#process it
res_queue.put(result)
res_queue.put("END")
def writeOutput(outFile, res_queue):
with open(outFile, 'w') as f
res=res_queue.get()
while res!='END':
f.write(res)
res=res_queue.get()
res_queue = multiprocessing.Queue()
if __name__ == '__main__':
data=loadHugeData()
p = multiprocessing.Process(target=writeOutput, args=(outFile, res_queue))
p.start()
processHugeData(data, res_queue)
p.join()
असली (विशेष रूप से'writeOutput() ') कोड एक बहुत अधिक जटिल है। 'writeOutput() 'केवल इन मानों का उपयोग करता है जो इसका तर्क (अर्थात् यह संदर्भ नहीं करता है'
असल में यह स्मृति में एक विशाल डेटासेट लोड करता है और इसे संसाधित करता है। आउटपुट का लेखन उप-प्रक्रिया में दिया जाता है (यह वास्तव में कई फाइलों में लिखता है और इसमें बहुत समय लगता है)। इसलिए प्रत्येक बार जब एक डेटा आइटम संसाधित हो जाता है तो इसे उप-प्रोसेस ट्रॉफ res_queue पर भेजा जाता है जो बदले में परिणामस्वरूप फ़ाइलों को परिणाम में लिखता है।
उप-प्रक्रिया को किसी भी तरह से'loadHugeData() 'द्वारा लोड किए गए डेटा को एक्सेस, पढ़ने या संशोधित करने की आवश्यकता नहीं है। उप-प्रक्रिया को केवल उस प्रक्रिया का उपयोग करने की आवश्यकता होती है जो मुख्य प्रक्रिया इसे 'gres_queue' को भेजती है। और यह मुझे मेरी समस्या और सवाल की ओर ले जाता है।
ऐसा लगता है कि उप-प्रक्रिया विशाल डेटासेट की प्रतिलिपि पर होती है (जब'top' 'के साथ मेमोरी उपयोग की जांच होती है)। क्या ये सच है? और यदि ऐसा है तो मैं आईडी से कैसे बच सकता हूं (डबल मेमोरी का उपयोग करके)?
मैं पायथन 2.6 का उपयोग कर रहा हूं और प्रोग्राम लिनक्स पर चल रहा है।
क्या आप अपने कोड को पुन: लोड करने के बजाय पुनर्विक्रेता का उपयोग करने के लिए पुन: स्थापित कर सकते हैं? ऐसा प्रतीत होता है कि अगर ऐसा लगता है कि लोड/प्रक्रिया/एनक्यू/डेक्यू/लिखना – sotapme
दुर्भाग्य से एक टैब-पृथक txt फ़ाइल मूल रूप से एक स्पैस सरणी है। और मुझे प्रोसेसिंग के दौरान लाइन नंबर के आधार पर इस डेटा में "यादृच्छिक पहुंच" की आवश्यकता है। इसलिए इसे स्मृति में लोड करना (स्पैस सरणी विशिष्ट अनुकूलन के साथ) बहुत तेजी से प्रसंस्करण करता है। – FableBlaze
यह प्रक्रिया एकीकरण करने के लिए '[beanstalkd] (https://github.com/earl/beanstalkc/blob/master/TUTORIAL.mkd) जैसे कुछ का उपयोग करने का सुझाव देने के लिए बड़े पैमाने पर ओवर-इंजीनियरिंग हो सकता है लेकिन यह जानना दिलचस्प होगा अगर यह मदद/स्केल/perfomed मदद की। हमेशा की तरह अन्य लोगों की समस्याएं हमेशा अधिक दिलचस्प होती हैं। – sotapme