【问题标题】:Can't iterate over huge number of DataStore records无法迭代大量 DataStore 记录
【发布时间】:2015-12-31 21:50:00
【问题描述】:

我正在尝试迭代大量数据存储记录,目前大约 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、deadline 或 read_policy 有更好的设置吗?

请注意,这个过程是在 CRON 作业中运行的,所以如果它需要很长时间来完成它不会打扰我。剩下的过程需要几秒钟,最难的部分是读入数据。

感谢您的任何想法!

【问题讨论】:

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


【解决方案1】:

两种选择:

  • 使用 App Engine 的 MapReduce 库在您的所有实体上运行。在 MapReduce 的 map 部分中,对每个实体执行您想做的神奇事情。教程可以在这里找到:MapReduce on App Engine made easy
  • 或者,使用查询大小有限的游标和任务。 IE。您的 cron 作业将运行第一批或实体,如果还有剩余,它将使用您刚刚运行的查询的查询光标启动另一个任务。

【讨论】:

    【解决方案2】:

    你没有说你是否使用任务队列,所以我假设你没有。

    cron 作业应该启动一个任务来执行您的处理,否则处理程序仍然有 60 秒的截止日期。将它作为一项任务运行会给你 10 分钟的截止日期。

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

    最后,如果作业长时间运行,您可以链接任务(查看您已经运行了多长时间并启动新任务以继续)或查看 mapreduce 作业。

    【讨论】:

    • cron 作业与任务具有相同的截止日期。不过,启动一个重试任务仍然很有用。
    • 我错过了限制增加(据我所知,它似乎只记录在 SDK 1.4 发行说明中。)我一直有 cron 启动任务,因为任务是可重试的,而 cron 请求是不是。
    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多