【问题标题】:How to count results from many GAE tasks?如何计算许多 GAE 任务的结果?
【发布时间】:2015-03-27 09:02:04
【问题描述】:

我运行许多任务来获取一些信息并进行处理。每个任务运行后,我都有一个整数,它表示我得到了多少部分信息。 我想得到从不同任务收到的​​这些整数的总和。

目前我使用memcache来存储sum:

def update_memcache_value(what, val, how_long=86400):
    value_old = get_memcache_value(what)
    memcache.set('system_'+what, value_old+val, how_long)

def get_memcache_value(what):
    value = memcache.get('system_'+what)
    if not value:
        value = 0
    return int(value)

update_memcache_value 在每个任务中被调用(经常不止一次)。但看起来那里的数据经常在白天丢失。我可以使用 NDB 来存储相同的数据,但它需要大量的写入操作。有没有更好的方法来存储相同的数据(计数器)?

【问题讨论】:

  • 不是 NDB 回写吗?所以我不确定你能做什么会更有效率。每次更新值时都无法避免写入 somewhere,如果要刷新并且需要持久性,则无法避免写入 cache->mem。
  • 使用 appengine-pipelines 和/或 appengine-mapreduce。
  • @DmitrySadovnychyi,我不会面临与 Pipelines (github.com/GoogleCloudPlatform/appengine-pipelines/wiki/Python) 使用相同的 NDB 限制吗?
  • 我认为降低成本的目标应该是在单个任务中处理尽可能多的数据。
  • 你的问题太宽泛了。有很多方法可以计算计数器,但它们涉及不同的方法。请编辑您的问题以专注于一种方法。

标签: python google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:

听起来您特别希望让许多任务完成总和的一部分,然后让这些任务最后都减少到一个数字......所以您想使用 MapReduce。或者你可以只使用 Pipelines,因为 MapReduce 实际上是建立在它之上的。如果您担心写入操作,那么您将无法利用 App Engine 的并行性

Google I/O 2010 - 使用 Google App Engine 的数据管道

https://www.youtube.com/watch?v=zSDC_TU7rtc

管道库

https://github.com/GoogleCloudPlatform/appengine-pipelines/wiki

MapReduce

https://cloud.google.com/appengine/docs/python/dataprocessing/

【讨论】:

    【解决方案2】:

    很遗憾,如果您的任务跨越一整天,memcache 就不是一种选择。

    如果您想减少写入操作,您可以设置第二个计数器并在 memcache 上每 100 个任务或任何适合您的值备份一次。

    如果您希望为每项任务使用写入操作来执行此操作,您可以尝试将这些结果备份到 3rd 方存储中,例如通过Spreasheets API 的 Google 电子表格,但这似乎只是为了节省一些编写操作(而不是性能,猜测不是问题)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多