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作业将运行第一个批处理或实体,如果还有剩余,它将使用您刚运行的查询的查询光标启动另一个任务。