大数据存储读取

我需要读取Google AppEngine数据存储区中的所有条目才能执行一些初始化工作。 有很多实体(目前有8万),并且这种情况还在继续增长。 我开始触及30秒的数据存储区查询超时限制。

是否有任何有关如何在数据存储中分割这些巨型读取的最佳实践? 任何例子?


你可以通过几种方式解决这个问题:

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

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

  • 见后端。 后端实例提供的请求没有时间限制。

  • 最后,如果你需要分解一个大任务并且执行并行比看mapreduce。


  • StackExchange上的这个答案为我提供了很好的服务:

    过期的查询和appengine

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

    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)
    
    链接地址: http://www.djcxy.com/p/57831.html

    上一篇: Big datastore reads

    下一篇: Inequality Filter in AppEngine Datastore