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 来一一完成,但这会很慢而且效率不高。

你们能想出什么办法让我更快地做到这一点吗?无论如何选择 5 到 5 个用户,比如 LIMIT=5 只获得前 5 个用户,但如果我能获得,首先是 5 个用户,然后是接下来的 5 个用户等等,迭代所有人,但查询更轻松。我可以设置更长的超时时间吗?

你能想到我能解决这个问题的任何方法吗?

4

3 回答 3

0

您可以使用光标与限制一起使用您停止的搜索:

返回一个 base64 编码的游标字符串,表示查询结果集中检索到的最后一个结果之后的位置。游标字符串可以安全地用于 HTTP GET 和 POST 参数,也可以存储在 Datastore 或 Memcache 中。未来对同一查询的调用可以通过 start_cursor 参数或 with_cursor() 方法提供此字符串,以恢复从此位置检索结果。

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

于 2012-10-17T09:41:17.590 回答
0

我会编写一个简单的请求处理程序来完成任务。

要么以可以在 mapreduce 上运行的方式编写它,要么启动后端来运行您的处理程序。

于 2012-10-17T15:11:57.950 回答
0

首先,通过批量获取实体将显着减少应用程序与数据存储的通信时间。有关这方面的详细信息,请查看您(可能)不了解的有关 App Engine 的 10 件事

然后,您可以将此过程分配给任务队列,使您能够执行长达 10 分钟的任务。有关任务队列的更多信息,请查看任务队列 Python API

最后,对于需要更多时间的任务,您还可以考虑使用后端。有关更多信息,您可以查看Backends (Python)

希望这可以帮助。

于 2012-10-17T16:35:44.517 回答