当从 Google AppEngine 的数据存储区检索行时,我们希望通过多个同步进程来实现对实体类型的所有数据的检索。这些进程在后端 Python 服务器中异步运行。关键是让每个进程检索整个数据集的“ block ”,以便我们可以几乎均匀地在所有进程之间分配负载,如下所示:
|_____|_____|_____|_____|_____|_____|_____|.....|_____|_____|
p1 p2 p3 p4 p5 p6 p7 pk-1 pk
其中每个 pn
都是一个进程,并且会检索所有实体。
我认为实现这一点的方法是以某种方式说这样的话(在Python中):
chunk_size = num_entities / num_chunks
base_query = 'select * from entity offset %d limit %d'
for chunk in range(0, to = num_entities, step_by = chunk_size):
cursor = get_cursor(base_query, offset = chunk, limit = chunk_size)
while is_ready(cursor):
do_task_with_data(cursor.next())
其中 get_cursor
将从 AppEngine 获取一个光标,该光标从给定偏移量开始的结果中滚动。我仅在此处包含 limit
参数,以防它有帮助,但例如,它也可以在 while
循环内强制执行。无论如何,我们希望得到这样一种情况:查询不是 O(n) 且有限制和偏移量的情况(即最后一个查询必须在获取数据之前滚动浏览几乎所有数据)。
另一种选择可能是根据一些随机值(我们确实有)来分配实体,使用 0 -> 1 的范围划分为 chunk_num block 。
甚至可以以某种方式从 App Engine 中获取数据转储,然后对其进行处理(尽管由于大小,这不是我们的首选)。
实现这一目标的好方法是什么?有没有更好的方法来解决这个问题?对此的任何想法将不胜感激。
最佳答案
我认为您几乎描述了 mapreduce framework 的内容。确实如此。
关于python - 对 App Engine 数据存储均匀分布的同步查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13640797/