无法迭代大量的DataStore记录

时间:2015-10-03 22:46:04

标签: python google-app-engine google-cloud-datastore large-data-volumes

我试图迭代大量的数据存储记录,目前大约有330,000个。从概念上讲,每条记录都有一行,一列和一个值,我会迭代记录并构建一个矩阵,然后我将其用于计算。

我得到的错误是:超时:数据存储区操作超时,或者数据暂时不可用。

[补充:请注意,我的问题不是应用引擎超时。作为CRON作业运行,我有足够的时间,数据存储区错误比应用程序引擎超时更快发生。此外,我已经尝试过其他问题中给出的答案,如下所述。]

错误发生在迭代运行的记录少于100,000之后。

我在查阅过去的相关主题后写的当前代码是:

    prodcauses_query = ProdCause.query(projection=['prod_id', 'value', 'cause']).filter(ProdCause.seller_id == seller_id)
    for pc in prodcauses_query.iter(read_policy=ndb.EVENTUAL_CONSISTENCY, deadline=600):
        ### COPY DATA IN RECORD PC INTO A MATRIX
        ### row is prod_id, col is cause, value is value

有没有比ITER更好的方法呢? batch_size或截止日期或read_policy的任何更好的设置?

请注意,此过程在CRON作业中运行,因此如果执行此操作需要很长时间,则不会打扰我。剩下的过程需要几秒钟,困难部分一直在阅读数据。

感谢您的任何想法!

2 个答案:

答案 0 :(得分:1)

两个选项:

  • 使用App Engine的MapReduce库在所有实体上运行。在MapReduce的 map 部分,您需要对每个实体执行神奇的操作。可以在此处找到教程:MapReduce on App Engine made easy
  • 或者,使用有限查询大小的游标和任务。 I.E.你的cron作业将运行第一批或多个实体,如果还有剩余,它将使用你刚刚运行的查询的查询光标启动另一个任务。

答案 1 :(得分:1)

如果您使用任务队列,我还没有说过,所以我认为您不是。

一个cron作业应该开始一个任务来进行其他处理,处理程序仍然有60秒的截止日期。将其作为任务运行将为您提供10分钟的截止日期。

考虑您的批量大小,指定大批量大小会减少往返次数。

最后,如果作业长时间运行,您可以链接任务(观察您运行的时间并开始新任务继续)或查看mapreduce作业。