मुझे लगता है कि ndb
लाइब्रेरी में मेमोरी लीक है लेकिन मुझे यह नहीं मिल रहा है।Google ndb लाइब्रेरी में मेमोरी लीक
क्या नीचे वर्णित समस्या से बचने का कोई तरीका है?
क्या आपके पास समस्या का पता लगाने के लिए परीक्षण का एक और सटीक विचार है?
कि कैसे मैं इस समस्या reproduced:
2 फाइलों के साथ एक minimalist Google अनुप्रयोग इंजन में बनाया।
app.yaml
:
application: myapplicationid
version: demo
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /.*
script: main.APP
libraries:
- name: webapp2
version: latest
main.py
:
# -*- coding: utf-8 -*-
"""Memory leak demo."""
from google.appengine.ext import ndb
import webapp2
class DummyModel(ndb.Model):
content = ndb.TextProperty()
class CreatePage(webapp2.RequestHandler):
def get(self):
value = str(102**100000)
entities = (DummyModel(content=value) for _ in xrange(100))
ndb.put_multi(entities)
class MainPage(webapp2.RequestHandler):
def get(self):
"""Use of `query().iter()` was suggested here:
https://code.google.com/p/googleappengine/issues/detail?id=9610
Same result can be reproduced without decorator and a "classic"
`query().fetch()`.
"""
for _ in range(10):
for entity in DummyModel.query().iter():
pass # Do whatever you want
self.response.headers['Content-Type'] = 'text/plain'
self.response.write('Hello, World!')
APP = webapp2.WSGIApplication([
('/', MainPage),
('/create', CreatePage),
])
मैं आवेदन अपलोड किया है, /create
एक बार कहा जाता है।
उसके बाद, /
पर प्रत्येक कॉल उदाहरण के द्वारा उपयोग की गई स्मृति को बढ़ाती है। जब तक यह Exceeded soft private memory limit of 128 MB with 143 MB after servicing 5 requests total
त्रुटि के कारण बंद हो जाता है।
नोट:: समस्या की तरह web.py
शायद [ndb इन-संदर्भ कैश] (https://cloud.google.com/appengine/docs/python/ndb/cache), मुझे उम्मीद है। –
मुझे अजगर के बारे में कुछ नहीं पता लेकिन आपका कोड पढ़ना मैं कहूंगा कि आपका मेमोरी खत्म हो रहा है क्योंकि आपका 'ndb.put_multi' एक ही लेनदेन में 100 इकाइयों को सम्मिलित करने का प्रयास करता है। शायद यही कारण है कि बहुत मेमोरी आवंटित की जा रही है। मुलायम निजी मेमोरी सीमा से अधिक संभवतः इसलिए है क्योंकि आपका अगला अनुरोध तब भी चल रहा है जब आपका अगला अनुरोध मेमोरी लोड में जोड़ने में आता है। यह तब नहीं होना चाहिए जब आप कॉल के बीच थोड़ी देर प्रतीक्षा करें (क्रमशः लेनदेन पूरा होने तक प्रतीक्षा करें)। प्रतिक्रिया समय में भारी वृद्धि होने पर भी ऐप इंजन को एक अतिरिक्त उदाहरण शुरू करना चाहिए। – konqi
@DanielRoseman "संदर्भ में कैश केवल एक धागे की अवधि के लिए बनी रहती है।" यदि आप संदर्भ में कैश साफ़ करते हैं या कैशिंग अक्षम करने के लिए नीति सेट करते हैं, तो स्मृति उपयोग अधिक धीरे-धीरे बढ़ता है लेकिन रिसाव बनी रहती है। – greg