【问题标题】:What's the most memory-efficient way of creating a large batch of datastore objects on Google App Engine?在 Google App Engine 上创建大量数据存储对象的最节省内存的方法是什么?
【发布时间】:2012-01-15 20:55:54
【问题描述】:

我有一些代码在 GAE 工作任务中大致执行此操作:

list_of_dicts = xmlrpc_call(...)
objects_to_put = []

for row in list_of_dicts.items():
    object = DatastoreModel(**row)
    object.x = ...
    objects_to_put.append(object)

db.put(objects_to_put)

我也试过这个:

list_of_dicts = xmlrpc_call(...)
objects_to_put = []

for row in list_of_dicts.items():
    object = DatastoreModel(**row)
    object.x = ...
    objects_to_put.append(object)
    if len(objects_to_put) > 10:
        db.put(objects_to_put)
        objects_to_put = []
db.put(objects_to_put)

(这个想法是每 10 个对象放置一次,以避免有一个庞大的列表)

问题始终是,这个代码块显然占用了大量内存,即使列表相对较小(约 100 个项目)并且最后一个项目中的每个项目只包含一个几个键。这里没有大块、大块字符串或其他相对较小的土豆数据结构。

是什么导致此工作器每次运行时都超出其内存配额,我如何才能有效地创建相对大量(约 100 个左右)的数据存储对象?

【问题讨论】:

  • 这是请求做的唯一事情吗?你确定这是罪魁祸首?其他处理程序呢?
  • 显然是这个要求,没错。我还没有完全排除该请求中出现其他问题的可能性,但这似乎不太可能。这是一个工作请求,只需拉入一些 xmlrpc,并将其转换为数据存储对象。

标签: python google-app-engine memory


【解决方案1】:

我认为第二种方法并添加 del 关键字会更好。 但很难说它能解决你的问题。

list_of_dicts = xmlrpc_call(...)
objects_to_put = []

for row in list_of_dicts.items():
    object = DatastoreModel(**row)
    object.x = ...
    objects_to_put.append(object)
    if len(objects_to_put) > 10:
        db.put_async(objects_to_put)
        del objects_to_put[:]

db.put_async(objects_to_put)

有一个 AppTrace 工具可以跟踪开发服务器中的内存使用情况。但是,它仅在开发服务器上运行。 http://code.google.com/p/apptrace/wiki/UsingApptrace

由于 apptrace 仅用于开发和调试目的, 它适用于 Google App Engine 的开发应用服务器 Python SDK 和 TyphoonAE。它肯定不会在 GAE 上工作 生产环境。

【讨论】:

  • 这看起来像是我想尝试使用的。谢谢。
猜你喜欢
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多