我运行了许多任务来获取一些信息并对其进行处理。每个任务运行后,我有一个整数,表示我已经获得了多少部分信息。 我想从不同的任务中得到这些整数的总和。
目前我使用memcache存储总和:
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来存储相同的数据,但它需要大量的写操作。有没有更好的方法来存储相同的数据(计数器)?
答案 0 :(得分:2)
听起来你特别希望让很多任务完成一部分,然后将这些任务减少到一个数字......所以你想要使用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/
答案 1 :(得分:0)
不幸的是,如果您的任务跨越全天,则memcache不是一个选项。
如果你想减少写操作,你可以设置第二个计数器,并在每100个任务或任何适合你的任务上备份memcache上的值。
如果您希望通过对所有任务使用write ops来执行此操作,您可以尝试通过Spreasheets API在第三方存储中备份这些结果,例如Google电子表格,但这似乎是一种过度杀伤力保存一些写操作(而不是高性能,猜测不是问题)。