Python 对App Engine数据存储的均匀分布同步查询

Python 对App Engine数据存储的均匀分布同步查询,python,sql,google-app-engine,Python,Sql,Google App Engine,当从Google AppEngine的数据存储中检索行时,我们希望通过几个同时的过程来实现对一个实体类型的所有数据的检索。这些进程在后端Python服务器中异步运行。关键是让每个进程检索整个数据集的一个“块”,这样我们就可以将负载几乎均匀地分布在所有进程上,如下所示: |_____|_____|_____|_____|_____|_____|_____|.....|_____|_____| p1 p2 p3 p4 p5 p6 p7

当从Google AppEngine的数据存储中检索行时,我们希望通过几个同时的过程来实现对一个实体类型的所有数据的检索。这些进程在后端Python服务器中异步运行。关键是让每个进程检索整个数据集的一个“块”,这样我们就可以将负载几乎均匀地分布在所有进程上,如下所示:

    |_____|_____|_____|_____|_____|_____|_____|.....|_____|_____|
       p1   p2    p3     p4    p5    p6    p7         pk-1   pk
其中每个
pn
都是一个进程,所有实体都被检索

我认为实现这一点的方法是(在Python中)这样说:

其中,
get\u cursor
将从AppEngine获取一个光标,该光标从给定偏移量开始的结果滚动。我只在这里包含
limit
参数,以防它有所帮助,但它也可以在
while
循环中强制执行。在任何情况下,我们都希望得到这样一种情况:查询不是带限制和偏移量的O(n)(即,在获取数据之前,最后的查询必须滚动浏览几乎所有的数据)

另一个选项可能是基于一些随机值(我们确实有)分布实体,使用0->1的范围划分为chunk_num chunks

它甚至可能以某种方式从AppEngine中获取数据转储,然后再进行处理(尽管由于大小的原因,它不是我们的第一选择)


实现这一目标的好方法是什么?有没有更好的办法来解决这个问题?如果您有任何关于这方面的想法,我们将不胜感激。

我认为您在描述公司的工作。

这听起来是个好主意。按照我的理解,使用这种方法,我会让每个映射者发送我需要发送的数据块,对吗?你认为需要采取一些“减少”步骤才能使其发挥作用吗?这逆转了并行化,在引擎端而不是后端服务器上进行并行化。我在这里使用mapreduce,但我认为mapreduce不能保证负载均匀分布。Mapreduce使用任务队列而不是后端,您的数据处理将在任务队列进程中进行。
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())