2011-01-31 79 views
1

我想用一些值填充我的數據存儲區。做這個的最好方式是什麼 ? 這是我的代碼 -Google App Engine填充數據存儲區條目

for n in range(seqlen): 
    for m in range(n+1): 
    for l in range(m+1): 
     temp = [-BIGINT for k in range(m-l+1)] 
     obj = DbEntity4D(key_name=str(n)+','+str(m) +','+ str(l)) 
     obj.value = temp 
     obj.put() 

還是這個更好?

for n in range(seqlen): 
    for m in range(n+1): 
    for l in range(m+1): 
     temp = [-BIGINT for k in range(m-l+1)] 
     obj[i] = DbEntity4D(key_name=str(n)+','+str(m) +','+ str(l)) 
     obj[i].value = temp 
     i = i+1 

    db.put(obj) 

或者還有其他更好的方法嗎?

seqlen可以是1到1000.它可能無法在10分鐘內完成整個過程,但我可以繼續從之前離開我的下一個任務。

回答

2

通過消除數據存儲的往返行爲,批處理數據存儲庫存將節省大量時間。

它看起來像你試圖用你的後一代碼塊(一次保存m實體)。在seqlen爲1000的情況下,您一次最多可以編寫1000個實體。但是,一次編寫的實體數量會有所不同,因爲您的最內層for循環隨其生成的實體數量而變化。如果您等待保存到數據庫,則可能會更快,直到您收集了n(某些大數目)的DbEntity4D實體,然後將它們保存(而不是始終在最內層循環之後立即保存它們)。當然,這可能會使邏輯更加複雜,從而允許下一個任務繼續添加創建這些實體的地方,以避免前一個任務停止。

+3

同意。我還建議使用remote_api,而不是試圖在單個請求或任務中執行此操作,因爲在應用引擎之外運行的remote_api腳本可以長期運行。 – ryan 2011-01-31 15:54:19