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

时间:2012-11-30 07:31:06

标签: python sql google-app-engine

从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中获取数据转储,然后对其进行处理(尽管由于大小而不是我们的首选)。

实现这一目标的好方法是什么?有没有更好的方法来解决这个问题?对此有任何想法都会非常感激。

1 个答案:

答案 0 :(得分:2)

我认为你几乎描述了mapreduce framework的作用。