4

我需要阅读 Google AppEngine 数据存储区中的所有条目来进行一些初始化工作。有很多实体(目前为 80k),而且还在继续增长。我开始达到 30 秒的数据存储查询超时限制。

对于如何在数据存储中对这些类型的大量读取进行分片,是否有任何最佳实践?有什么例子吗?

4

2 回答 2

3

您可以通过多种方式解决此问题:

  1. 在具有 10 分钟超时而不是 30 秒(实际上更像 60 秒)的任务队列上执行您的代码。最简单的方法是通过DeferredTask.

    警告:DeferredTask 必须是可序列化的,因此很难传递复杂的数据。也不要让它成为一个内部类。

  2. 后端。后端实例服务的请求没有时间限制。

  3. 最后,如果您需要分解一个大任务并并行执行,那么请查看mapreduce

于 2012-08-24T06:56:43.950 回答
0

StackExchange 上的这个答案对我很有帮助:

过期查询和应用引擎

我不得不稍微修改它来为我工作:

def loop_over_objects_in_batches(batch_size, object_class, callback):

    num_els = object_class.count() 
    num_loops = num_els / batch_size
    remainder = num_els - num_loops * batch_size
    logging.info("Calling batched loop with batch_size: %d, num_els: %s, num_loops: %s, remainder: %s, object_class: %s, callback: %s," % (batch_size, num_els, num_loops, remainder, object_class, callback))    
    offset = 0
    while offset < num_loops * batch_size:
        logging.info("Processing batch (%d:%d)" % (offset, offset+batch_size))
        query = object_class[offset:offset + batch_size]
        for q in query:
            callback(q)

        offset = offset + batch_size

    if remainder:
        logging.info("Processing remainder batch (%d:%d)" % (offset, num_els))
        query = object_class[offset:num_els]
        for q in query:
            callback(q)
于 2012-09-10T20:56:26.807 回答