1

高レベルの情報を取得するには、データストアで重いクエリを実行する必要があります。60 秒に達すると、タイムアウト カットと思われるエラーが表示されます。

Traceback (most recent call last):
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 207, in Handle
result = handler(dict(self._environ), self._StartResponse)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__
rv = self.router.dispatch(request, response)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
return route.handler_adapter(request, response)
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1077, in __call__
return handler.dispatch()
File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
return method(*args, **kwargs)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/admin/__init__.py", line 140, in xsrf_required_decorator
method(self)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/admin/__init__.py", line 348, in post
exec(compiled_code, globals())
File "<string>", line 28, in <module>
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2314, in next
return self.__model_class.from_entity(self.__iterator.next())
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 1442, in from_entity
return cls(None, _from_entity=entity, **entity_values)
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 958, in __init__
if isinstance(_from_entity, datastore.Entity) and _from_entity.is_saved():
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/api/datastore.py", line 814, in is_saved
self.__key.has_id_or_name())
File "/base/python27_runtime/python27_lib/versions/1/google/appengine/api/datastore_types.py", line 565, in has_id_or_name
elems = self.__reference.path().element_list()
DeadlineExceededError

これはアプリケーション クエリではありません。Interactive Console を介してアプリと対話しているため、ライブの問題ではありません。私の問題は、すべてのアプリケーション ユーザーを反復処理して、それぞれのユーザーに対して取得する必要がある大量のデータをチェックする必要があることです。user_id をハードコーディングすることで 1 つずつ実行できますが、遅くて非効率的です。

これをより速く行う方法を考えてもらえますか?LIMIT=5 のように、おそらく 5 人ずつ 5 人のユーザーを選択する方法はありますか?最初の 5 人のユーザーのみを取得しますが、最初に 5 人のユーザー、その後、次の 5 人のユーザーなどを取得できれば素晴らしいと思います。それらすべてによって、しかしより軽いクエリで。より長いタイムアウトを設定できますか?

私がこの問題に対処できると考える方法はありますか?

4

3 に答える 3

0

まず、エンティティをバッチで取得することにより、アプリケーションとデータストアとの通信時間が大幅に短縮されます。詳細については、App Engineについて(おそらく)知らなかった10のことを見てください。

次に、この手順をタスクキューに割り当てて、最大10分間のタスクを実行できるようにします。タスクキューの詳細については、タスクキューPythonAPIをご覧ください

最後に、より多くの時間を必要とするタスクについては、バックエンドの使用を検討することもできます。詳細については、バックエンド(Python)を参照してください。

お役に立てれば。

于 2012-10-17T16:35:44.517 に答える
0

タスクを実行するための単純なリクエストハンドラを作成します。

mapreduceで実行できるように記述するか、バックエンドを起動してハンドラーを実行します。

于 2012-10-17T15:11:57.950 に答える
0

limit と組み合わせて、カーソルを使用して中断したところから検索を開始できます。

取得された最後の結果に続くクエリの結果セット内の位置を示す、base64 でエンコードされたカーソル文字列を返します。カーソル文字列は、HTTP GET および POST パラメーターで安全に使用でき、データストアまたは Memcache に格納することもできます。同じクエリの今後の呼び出しでは、start_cursor パラメータまたは with_cursor() メソッドを介してこの文字列を提供し、この位置から結果の取得を再開できます。

https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_cursor

于 2012-10-17T09:41:17.590 に答える