2012-01-15 43 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

相關問題