2

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

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

4

1 回答 1

2

我认为您几乎在描述mapreduce 框架的作用。

于 2012-11-30T07:44:43.207 回答