2012-01-15 51 views
1

我有一些代码,大概做了这样的GAE工人的任务里面:在Google App Engine上创建大批数据存储对象的最有效的内存方式是什么?

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项),并在拉斯维加斯的每个项目t只包含几个键。没有大的斑点,大块的字符串,或者其他任何东西,但相对较小的土豆数据结构。

是什么导致这名工人每次运行时超过其内存配额,我怎么能高效地创建数据存储对象的一个​​比较大的(〜100左右)是多少?

+1

这是唯一的请求吗?你确定这是罪魁祸首吗?其他处理程序呢? – 2012-01-15 22:59:22

+0

很明显,这是一个要求。我并没有完全排除在该请求中可能会发生其他问题,但这似乎不太可能。这是一个工作者请求,它简单地引入一些xmlrpc,并将其转换为datastrore对象。 – 2012-01-16 22:17:05

回答

2

我认为第二种方法并添加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会是为开发和调试,仅供参考, 其工作原理与谷歌应用程序引擎 的Python SDK和TyphoonAE开发应用程序服务器。它绝对不适用于GAE 生产环境。

+0

这看起来像我想尝试使用。谢谢。 – 2012-01-16 22:17:57

相关问题