Pérdida de memoria en la biblioteca ndb de Google
Creo que hay una pérdida de memoria en elndb
biblioteca pero no puedo encontrar dónde.
¿Hay alguna forma de evitar el problema que se describe a continuación?
¿Tiene una idea más precisa de las pruebas para descubrir dónde está el problema?
Así es como reproduje el problema:
Creé una aplicación minimalista de Google App Engine con 2 archivos.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),
])
Subí la aplicación, llamada/create
una vez.
Después de eso, cada llamada a/
aumenta la memoria utilizada por la instancia. Hasta que se detenga debido al errorExceeded soft private memory limit of 128 MB with 143 MB after servicing 5 requests total
.
Ejemplo de gráfico de uso de memoria (puede ver el crecimiento de la memoria y los bloqueos):
Nota: El problema se puede reproducir con otro marco que no seawebapp2
, me gustaweb.py