私はいくつかのユーティリティ タスクにリモート API を使用していますが、Appengine で実行するコードよりも桁違いに遅いことに気付きました。シンプルな get_by_id(list) は、リモート API を使用して数分かかり、Appengine で数秒実行しました。
ログは、リモート API がそれぞれ数秒かけて個別に取得したことを示しています。一方、Appengine では、オブジェクトのリスト全体がほぼ同時に取得されます。
この状況を改善する方法はありますか?
私はいくつかのユーティリティ タスクにリモート API を使用していますが、Appengine で実行するコードよりも桁違いに遅いことに気付きました。シンプルな get_by_id(list) は、リモート API を使用して数分かかり、Appengine で数秒実行しました。
ログは、リモート API がそれぞれ数秒かけて個別に取得したことを示しています。一方、Appengine では、オブジェクトのリスト全体がほぼ同時に取得されます。
この状況を改善する方法はありますか?
さて、私はそれを自分でテストし、1000個のエンティティをフェッチするのに非常に長い時間がかかることを発見しました。この場合、remote_apiクライアントはエンティティごとに1つのリクエストを行うように感じます。これは、データストアAPI呼び出しのデフォルトオプションが変更されたためです。コールにmax_entity_groups_per_rpcconfigオプションを設定することにより、コールを固定できます。次に例を示します。
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))
これを回避できます。
remoteapiはコードをローカルで実行し、datastore / blobstore/etcに対してのみappengineサーバーを呼び出すことを忘れないでください。オペレーション。つまり、本質的には、ネットワーク上に存在するデータベースにアクセスするコードを実行していることになります。間違いなく遅いです。