2012-05-01 33 views
2

我使用遠程API進行一些實用工作,我注意到它比Appengine上運行的代碼慢幾個數量級。一個簡單的get_by_id(list)使用遠程API花費了幾分鐘,並且在Appengine上運行了幾秒鐘。遠程API非常慢

日誌顯示遠程API分別獲取每個需要幾秒鐘;而在Appengine上,大概同一時間檢索整個對象列表。

有什麼辦法可以改善這種情況嗎?

+0

列表有多大?當你測試時,你有沒有在雲上運行的活動實例?啓動實例通常需要多長時間?你正在使用哪個運行時? –

+0

用真正的解決方法更新了我的答案。 –

回答

2

那麼,我自己測試了一下,發現獲取1000個實體需要很長時間。我覺得在這種情況下,remote_api客戶端爲每個實體發出一個請求。這是因爲我們的數據存儲API調用的默認選項已更改。您可以通過在呼叫中設置max_entity_groups_per_rpc配置選項來緊固呼叫。這裏有一個例子:

config = db.create_config(max_entity_groups_per_rpc=50) 
entities = MyModel.get_by_id(l, config=config) 
# or 
entities = db.get(key_list, config=config) 

或者,連鍵查詢快得多,因此,如果您的鍵列表是連續的,你可以創建一個查詢與重要範圍,如:

MyModel.all().filter('__key__ >=', db.Key.from_path('MyModel', 1)).\ 
    filter('__key__ <', db.Key.from_path('MyModel', 1001)) 

可以解決辦法這個。

+0

在我的測試中,儘管添加了config參數,但遠程API仍然爲每個實體做了一個請求。我相信get_by_id()本質上是一個關鍵的查詢 - 在API調用之前將id轉換爲一個鍵。 – FoxyLad

+0

你能告訴我實際的remote_api會話嗎? –

1

不要忘了remoteapi在本地執行您的代碼,並且只爲數據存儲/ blobstore/etc調用appengine服務器。操作。所以實質上,你正在運行的是處理網絡數據庫的代碼。這肯定比較慢。