Google app engine 执行数据库清理时,在应用程序引擎上获取内存限制超出错误

Google app engine 执行数据库清理时,在应用程序引擎上获取内存限制超出错误,google-app-engine,google-app-engine-python,Google App Engine,Google App Engine Python,我有下面的代码,我每周都通过cron作业运行它来清除旧的db条目。3-4分钟后,在总共处理1006个请求后,我的软私有内存超过了128 MB和189 MB的限制 然后还有一条消息,在处理该请求时,处理该请求的进程被发现占用了太多内存,因此被终止。这可能会导致应用程序的下一个请求使用新进程。如果经常看到此消息,则应用程序中可能存在内存泄漏。下面是清晰的代码 def clean_user_older_stories(user): stories = Story.query(Story.user=

我有下面的代码,我每周都通过cron作业运行它来清除旧的db条目。3-4分钟后,在总共处理1006个请求后,我的软私有内存超过了128 MB和189 MB的限制

然后还有一条消息,在处理该请求时,处理该请求的进程被发现占用了太多内存,因此被终止。这可能会导致应用程序的下一个请求使用新进程。如果经常看到此消息,则应用程序中可能存在内存泄漏。下面是清晰的代码

def clean_user_older_stories(user):
  stories = Story.query(Story.user==user.key).order(-Story.created_time).fetch(offset=200, limit=500, keys_only=True)
  print 'stories len ' + str(len(stories))
  ndb.delete_multi(stories)


def clean_older_stories():
  for user in User.query():
    clean_user_older_stories(user)

我想有更好的方法来处理这个问题。如何处理此问题?

您是否尝试过将您的用户查询设置为仅限密钥的查询?除了密钥之外,您没有使用任何用户属性,这将有助于减少内存使用

您应该通过设置页面大小并使用

处理程序可以使用下一个游标通过任务队列调用自身,直到到达结果集的末尾。您也可以选择将用于此类任务


这就是说,用户和商店之间的“加入”可能会使这一点具有挑战性。我会先浏览用户,因为从您所描述的情况来看,用户会随着时间的推移而增长,但每个用户的故事数是有限的。

您是否尝试过将用户查询设置为只包含关键字的查询?除了密钥之外,您没有使用任何用户属性,这将有助于减少内存使用

您应该通过设置页面大小并使用

处理程序可以使用下一个游标通过任务队列调用自身,直到到达结果集的末尾。您也可以选择将用于此类任务

这就是说,用户和商店之间的“加入”可能会使这一点具有挑战性。我会先浏览用户,因为从您描述的情况来看,用户会随着时间的推移而增长,但每个用户的故事数量有限。

这是因为

通过在后台任务中执行长时间运行的查询,上下文内缓存可能会消耗大量内存。这是因为缓存保留了在当前上下文中检索或存储的每个实体的副本

尝试禁用缓存

要避免长时间运行的任务中出现内存异常,可以禁用缓存或设置排除消耗内存最多的实体的策略

是因为

通过在后台任务中执行长时间运行的查询,上下文内缓存可能会消耗大量内存。这是因为缓存保留了在当前上下文中检索或存储的每个实体的副本

尝试禁用缓存

要避免长时间运行的任务中出现内存异常,可以禁用缓存或设置排除消耗内存最多的实体的策略

ctx = ndb.get_context
ctx.set_cache_policy(False)
ctx.set_memcache_policy(False)