当我对一大群小对象(15k只有几个短字符串和布尔属性的对象)运行查询时,没有对这些对象做任何事情,我看到我的实例的内存使用量不断增加(增加了70Mb)。内存的增加看起来与查询所需的内存数据量不成比例。
我使用的循环如下所示:
cursor = None
while True:
query = MyModel.all()
if cursor:
query.with_cursor(cursor)
fetched = 0
for result in query.run(batch_size = 500):
fetched += 1
# Do something with 'result' here. Actually leaving it empty for
# testing to be sure I don't retain anything myself
if fetched == 500:
cursor = query.cursor()
break
else:
break
为了确保这不是由于appstats造成的,我调用appstats。记录。dont_record()
不记录任何统计数据。
有人知道会发生什么吗?或者关于如何调试/配置文件的任何提示?
更新1:我打开了gc。在生产代码上设置_debug(gc.debug_STATS)
,我看到垃圾收集器被定期调用,因此它正在尝试收集垃圾。当我调用gc时。collect()
在循环结束时(也是请求结束时);它返回0
,但没有帮助。
更新2:我做了一些黑客攻击来让孔雀鱼dev_appserver,这似乎表明,在循环结束时,在一个显式的gc.collect()
之后,大部分内存被消耗了google.appengine.datastore.entity_pb。财产'。
我已经向appengine团队报告了这一点,他们似乎确认这实际上是一个问题(怀疑与游标的处理有关)。
每个模型实体都有一些过头。
查询将对象作为Protobufs返回给启动器。
因此,您将为结果集创建一系列批处理的protobuf。
然后它被解码。每个解码实体包括属性名称以及每个实体的数据。你有15K实体。例如,你的财产名称有多大。
因此,在内存中至少有两个结果集的副本,其形式多种多样(可能更多),不包括对模型类实例所做的任何其他操作。
您的代码/循环没有进行垃圾收集的机会,这可以/将在以后发生。
看看像appTrace这样的工具来帮助内存分析。
我正在看新的谷歌云数据存储,看起来很棒。但有件事我不明白。。。它应该替代谷歌应用引擎数据存储吗?我如何在GAE内部使用它?它们之间有什么区别? 我在Java有一个GAE应用程序,它使用3个实体,每个实体都有数千行,我需要经常做连接...
我有以下代码试图在一个大表上循环(~100k行;~30GB) 但是,我不断遇到以下错误: 处理此请求时,发现处理此请求的进程占用了太多内存,因此终止。这可能会导致应用程序的下一个请求使用新进程。如果经常看到此消息,则应用程序中可能存在内存泄漏。 ...有时候...... 在处理总共9个请求后,超过了128 MB的软私有内存限制,达到154 MB 我改变了我的代码,所以我总是在任何给定的时间只提取1
我看到了这个Python问题:应用引擎延迟:跟踪内存泄漏 ...同样,我也遇到了这个可怕的错误: 在为总共384个请求提供服务后,超过了128 MB的软专用内存限制 ... 处理此请求后,发现处理此请求的进程占用了太多内存,因此被终止。这可能会导致应用程序的下一个请求使用新进程。如果经常看到此消息,则应用程序中可能存在内存泄漏。 根据另一个问题,可能是“实例类”太小,无法运行这个应用程序,但是在增
我是谷歌应用引擎的新手。要使用Java App Engine,Google提供了两个选项:创建一个Maven项目,或者由Eclipse Google插件支持的非Maven项目。根据文档,Eclipse版本更容易。那么我应该继续日食吗?但是我看到了很多关于maven的帖子。有人能评论一下使用Maven的利弊吗。 谢谢
如何配置我的应用程序引擎应用程序的内存(RAM)使用情况?我试图解决与超过实例内存限制相关的错误。我尝试过这些东西,到目前为止,它们不起作用或者不能提供我需要的东西。 Appstats。这不提供内存使用的详细信息 以上任何一点我都错了吗?在这个问题上,评分最高的答案(不是公认的答案)表示没有办法监控App Engine上的内存使用情况。那不可能是真的。可以吗? 编辑 我可以确认GAE mini p
我正在尝试使用Flask和MySQL在Google App Engine标准环境中设置Web应用程序。 我知道Google App Engine能够根据所需的性能动态扩展其实例,但我不确定如何为我的MySQL服务器执行此操作。 对于MySQL连接,我尝试连接到Google Cloud SQL。我知道这对于单个实例是如何工作的,但我想知道是否可以连接多个实例,从而允许在使用相同数据的同时动态扩展存储