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