2010-09-17 13 views
5

में मेमोरी खपत मैं एक रीस्टफुल वेब सेवा में चेरीपी का उपयोग कर रहा हूं और सर्वर परिणामस्वरूप एक्सएमएल लौटाता है (एलएक्सएमएल एक्सएमएल बनाने के लिए इस्तेमाल किया जा रहा है)। उनमें से कुछ एक्सएमएल काफी बड़े हैं। मैंने देखा है कि इस तरह के अनुरोध के बाद स्मृति जारी नहीं की जा रही है (जो बड़े एक्सएमएल लौटाता है) संसाधित किया गया है।चेरीपी

तो, मैं एक समस्या अलग-थलग और यह एक बहुत ही कम डमी उदाहरण बनाया है:, http://localhost:8080/index स्मृति खपत 1.2GB करने के लिए 830MB से चला जाता है:

import cherrypy 
from lxml import etree 

class Server: 
    @cherrypy.expose 
    def index(self): 
     foo = etree.Element('foo') 
     for i in range(200000): 
      bar = etree.SubElement(foo, 'bar') 
      bar1 = etree.SubElement(bar, 'bar1') 
      bar1.text = "this is bar1 text ({0})".format(i) 
      bar2 = etree.SubElement(bar, 'bar2') 
      bar2.text = "this is bar2 text ({0})".format(i) 
      bar3 = etree.SubElement(bar, 'bar3') 
      bar3.text = "this is bar3 text ({0})".format(i) 
      bar4 = etree.SubElement(bar, 'bar4') 
      bar4.text = "this is bar4 text ({0})".format(i) 
      bar5 = etree.SubElement(bar, 'bar5') 
      bar5.text = "this is bar5 text ({0})".format(i) 

     return etree.tostring(foo, pretty_print=True) 

if __name__ == '__main__': 
    cherrypy.quickstart(Server()) 

अनुरोध करने के बाद किया गया है। फिर, अनुरोध संसाधित होने के बाद यह 1.1 जीबी तक चला जाता है और सर्वर बंद होने तक वहां रहता है। सर्वर बंद होने के बाद, स्मृति खपत 830 एमबी तक गिर जाती है।

मेरी प्रोजेक्ट में, डेटा (निश्चित रूप से) डेटाबेस से आता है, और पैरामीटर का उपयोग यह निर्दिष्ट करने के लिए किया जा रहा है कि कौन सा डेटा पुनर्प्राप्त किया जाना चाहिए। यदि एक ही अनुरोध (उसी पैरामीटर के साथ) बनाया गया है, तो स्मृति 1.1 जीबी पर रहता है, यानी कोई अतिरिक्त मेमोरी का उपयोग नहीं किया जा रहा है। लेकिन, यदि विभिन्न पैरामीटर पारित किए जा रहे हैं, तो सर्वर अधिक से अधिक स्मृति का उपभोग करता रहता है। स्मृति को मुक्त करने का एकमात्र तरीका सर्वर को पुनरारंभ करना है।

क्या आपके पास कोई विचार है कि यह क्यों हो रहा है और इसे कैसे हल किया जाए? धन्यवाद।

+0

पर एक महान जवाब क्या ओएस आपके द्वारा प्रयोग किए सवाल है? – unutbu

+0

मैं उबंटू का उपयोग कर रहा हूं। रिलीज होने पर मुझे उत्सुकता से उत्सुकता का कारण यह तथ्य है कि डेटाबेस 100 जीबी से अधिक है। चूंकि सर्वर अधिक से अधिक चल रहा है, ऐसे कई अलग-अलग अनुरोध हैं जिनके परिणामस्वरूप अधिक स्मृति का उपयोग किया जा रहा है। मेरी चिंता यह थी कि क्या होगा जब यह स्मृति खपत स्मृति के भौतिक आकार के करीब आती है? क्या पाइथन जान लेंगे कि उस मेमोरी का पुन: उपयोग कैसे करें, जो वर्तमान में हो रहा है (लेकिन जिसका उपयोग नहीं किया जा रहा है) जब नए अनुरोध आते हैं? मैं हाँ मानता हूं, लेकिन सिर्फ जांचना चाहता था। इसके अलावा, अगर स्मृति की मांग में अन्य प्रक्रियाएं हैं तो क्या होगा? वे किस स्मृति का उपयोग करेंगे? – kevin

उत्तर

1

यह एक सामान्य पायथन समस्या है, वास्तव में एक चेरीपी प्रति नहीं है। effbot http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm

में इस सवाल का जवाब एक महान है और एक समान अतः How can I explicitly free memory in Python?

+0

मैं देखता हूं। उत्तर के लिए बहुत बहुत धन्यवाद। क्या होता है जब स्मृति खपत भौतिक स्मृति सीमा के करीब आता है और नया अनुरोध आता है? क्या पाइथन को पता चल जाएगा कि प्रक्रिया को किस प्रकार इस्तेमाल किया जा रहा है लेकिन इसका उपयोग नहीं कर रहा है? स्मृति की मांग में अन्य प्रक्रियाओं का क्या होगा? क्या मुझे धागे की बजाय प्रक्रियाओं का उपयोग करने पर विचार करना चाहिए? समय के साथ यह सर्वर अधिक से अधिक स्मृति पर कब्जा करेगा (जैसा कि अलग अनुरोध आएगा)। क्या कोई पल है जब पाइथन इस कब्जे में उपयोग करना शुरू कर देगा (लेकिन स्मृति का उपयोग नहीं किया जाएगा) या यह सिर्फ हमारी याददाश्त चलाएगा और स्वैप का उपयोग शुरू कर देगा? – kevin

+1

हां, पायथन स्मृति का पुन: उपयोग करेगा। स्मृति की मांग करने वाली अन्य प्रक्रियाएं इसके लिए प्रतिस्पर्धा करती हैं, आमतौर पर ओएस द्वारा नियंत्रित होती है। लिनक्स ओएस में "ओओएम हत्यारा" के लिए देखो। थ्रेड्स साझा करने के लिए एक उपकरण हैं और इसलिए * प्रक्रियाओं की तुलना में * स्मृति खपत को कम करें। और अंत में, हाँ, स्वैप हर समय प्रयोग किया जाता है। अपने ओएस दस्तावेज़ पढ़ें। – fumanchu

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