关于python:无法迭代大量的DataStore记录

Can't iterate over huge number of DataStore records

我正在尝试遍历大量数据存储记录,目前大约330,000。从概念上讲,每条记录都有一行,一列和一个值,我要遍历记录并构造一个矩阵,然后将其用于计算。

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

[添加:注意,我的问题不是应用引擎超时。作为CRON作业运行,我有很多时间,而且数据存储错误的发生速度比应用程序引擎超时更快。另外,我也尝试过其他问题中给出的答案,如下所述。]

迭代运行少于100,000条记录后,将发生错误。

我在咨询了过去的相关主题后编写的当前代码是:

1
2
3
4
    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更好的方法吗?批处理大小或期限或read_policy是否有更好的设置?

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

感谢您的任何想法!


您没有说您是否使用任务队列,所以我认为您没有。

计划任务应启动任务以其他方式进行处理,否则处理程序仍将有60秒的截止日期。将其作为任务运行将给您10分钟的期限。

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

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


两种选择:

  • 将MapReduce库用于App Engine可以在所有实体上运行。在MapReduce的地图部分中,您要对每个实体执行神奇的操作。可以在此处找到教程:App Engine上的MapReduce变得简单
  • 或者,使用具有有限查询大小的游标和任务。即您的cron作业将运行第一个批处理或实体,如果还有剩余,它将使用您刚运行的查询的查询光标启动另一个任务。