我将远程API用于某些实用程序任务,我注意到它比在Appengine上运行的代码慢了几个数量级。一个简单的get_by_id(列表)使用远程API花了几分钟,在Appengine上运行了几秒钟。
日志显示远程API分别获取,每次几秒钟;而在Appengine上,几乎在同一时间内检索整个对象列表。
有没有办法改善这种情况?
答案 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))
你可以解决这个问题。
答案 1 :(得分:2)
不要忘记remoteapi在本地执行您的代码,只调用数据存储区/ blobstore / etc的appengine服务器。操作。所以从本质上讲,您运行的代码正在通过网络访问数据库。这肯定慢了。