我使用遠程API進行一些實用工作,我注意到它比Appengine上運行的代碼慢幾個數量級。一個簡單的get_by_id(list)使用遠程API花費了幾分鐘,並且在Appengine上運行了幾秒鐘。遠程API非常慢
日誌顯示遠程API分別獲取每個需要幾秒鐘;而在Appengine上,大概同一時間檢索整個對象列表。
有什麼辦法可以改善這種情況嗎?
我使用遠程API進行一些實用工作,我注意到它比Appengine上運行的代碼慢幾個數量級。一個簡單的get_by_id(list)使用遠程API花費了幾分鐘,並且在Appengine上運行了幾秒鐘。遠程API非常慢
日誌顯示遠程API分別獲取每個需要幾秒鐘;而在Appengine上,大概同一時間檢索整個對象列表。
有什麼辦法可以改善這種情況嗎?
那麼,我自己測試了一下,發現獲取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))
可以解決辦法這個。
在我的測試中,儘管添加了config參數,但遠程API仍然爲每個實體做了一個請求。我相信get_by_id()本質上是一個關鍵的查詢 - 在API調用之前將id轉換爲一個鍵。 – FoxyLad
你能告訴我實際的remote_api會話嗎? –
不要忘了remoteapi在本地執行您的代碼,並且只爲數據存儲/ blobstore/etc調用appengine服務器。操作。所以實質上,你正在運行的是處理網絡數據庫的代碼。這肯定比較慢。
列表有多大?當你測試時,你有沒有在雲上運行的活動實例?啓動實例通常需要多長時間?你正在使用哪個運行時? –
用真正的解決方法更新了我的答案。 –