当前位置: 首页 > 知识库问答 >
问题:

谷歌应用程序引擎数据库查询内存使用情况

靳茂
2023-03-14

当我对一大群小对象(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。财产'。

共有2个答案

羊舌兴文
2023-03-14

我已经向appengine团队报告了这一点,他们似乎确认这实际上是一个问题(怀疑与游标的处理有关)。

禄源
2023-03-14

每个模型实体都有一些过头。

查询将对象作为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。我知道这对于单个实例是如何工作的,但我想知道是否可以连接多个实例,从而允许在使用相同数据的同时动态扩展存储