当从 Google AppEngine 的数据存储中检索行时,我们希望实现对实体类型的所有数据的检索,并具有多个同时处理的过程。这些进程在后端 Python 服务器中异步运行。关键是让每个进程检索整个数据集的“块”,这样我们就可以几乎均匀地将负载分布在所有进程中,如下所示:
|_____|_____|_____|_____|_____|_____|_____|.....|_____|_____|
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 块。
甚至有可能以某种方式从 App Engine 中获取数据转储,然后对其进行处理(尽管由于大小,它不是我们的首选)。
什么是实现这一目标的好方法?有没有更好的方法来解决这个问题?对此的任何想法将不胜感激。