【发布时间】:2015-08-06 10:43:45
【问题描述】:
当我对一大组小对象(只有几个短字符串和布尔属性的 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.recording.dont_record() 不记录任何统计信息。
有人知道会发生什么吗?或者关于如何调试/分析这个的任何指针?
更新 1:我在生产代码上打开了gc.set_debug(gc.DEBUG_STATS),我看到垃圾收集器被定期调用,所以它正在尝试收集垃圾。当我在循环结束时(也是请求结束)调用gc.collect();它返回0,但没有帮助。
更新 2:我做了一些 hack,让 guppy 在 dev_appserver 上工作,这似乎表明,在循环结束时明确的 gc.collect() 之后,大部分内存是由“google.appengine.datastore.entity_pb.Property 的字典”使用。
【问题讨论】:
标签: python google-app-engine google-cloud-datastore google-app-engine-python