从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中获取数据转储,然后对其进行处理(尽管由于大小而不是我们的首选)。
实现这一目标的好方法是什么?有没有更好的方法来解决这个问题?对此有任何想法都会非常感激。