Google app engine Google appengine,运行大型数据存储写入cron作业的最便宜的方法?

Google app engine Google appengine,运行大型数据存储写入cron作业的最便宜的方法?,google-app-engine,go,cron,Google App Engine,Go,Cron,我有一个Google appengine应用程序,用Go编写,它有一个cron进程,每天凌晨3点运行一次。这个过程查看一天中我的数据发生的所有变化,并存储一些关于发生了什么的元数据。我的用户可以对这些元数据运行报告,查看几个月来发生的趋势。该过程每晚进行约1000-2000万次数据存储写入。这一切都很好,但自从我开始运行它以来,我注意到谷歌每月的账单大幅增加(从大约50美元/月增加到大约400美元/月) 我刚刚设置了一个非常基本的taskqueue,在其中运行,我根本没有更改默认设置。有没有更好

我有一个Google appengine应用程序,用Go编写,它有一个cron进程,每天凌晨3点运行一次。这个过程查看一天中我的数据发生的所有变化,并存储一些关于发生了什么的元数据。我的用户可以对这些元数据运行报告,查看几个月来发生的趋势。该过程每晚进行约1000-2000万次数据存储写入。这一切都很好,但自从我开始运行它以来,我注意到谷歌每月的账单大幅增加(从大约50美元/月增加到大约400美元/月)


我刚刚设置了一个非常基本的taskqueue,在其中运行,我根本没有更改默认设置。有没有更好的方法,我可以在晚上运行这个过程,可以节省我的钱?我从来没有弄乱过后端(现在已经贬值)或模块api,我知道它们最近已经改变了很多东西,所以我不确定从哪里开始寻找。任何建议都将不胜感激。

请在凌晨3点查看您的实例。可能是GAE为了处理这项工作而增加了很多人。您可以配置您的作业,使其运行更少的并行,这样它将需要更长的时间,但可能只需要一个实例。 然而,如果您的数据库写入确实是最大的因素,那么这不会产生很大影响


您可以尝试查看数据模型和索引。请记住,每个索引字段需要额外2次写入,因此,如果不需要,请查看是否可以从某些字段中删除索引。

可以做的一个改进是批量写入操作,您可以使用memcache(支付专用的索引,因为它更可靠)。将更新写入memcache,当它达到900K左右时,将其刷新到数据存储。这将大大减少对数据存储的写入次数,尤其是在元数据较小的情况下。

1000-2000万次写入“某些元数据”似乎太多了。不清楚您的要求是什么。您的成本由这些数据存储写入驱动(因为您不使用后端,所以实例时间不是问题)。你怎么做(在晚上,使用cron作业,在后端等)并不重要。我想部分问题是我不知道我想问什么,因为我不太熟悉后端/模块(或其他选项)以及它们的具体好处。但是你有一个很好的观点,如果我的成本是由写操作驱动的,并且后端/模块的主要好处是更便宜的实例时间,那么它们不会有帮助。我想我将不得不走漫长的路,转而考虑使我的逻辑和数据结构更加高效。谢谢。谢谢你,克里斯蒂安,非常有用的建议。我认为主要的问题在于我的数据模型,只是需要太多的写操作来完成我正在做的事情。我是一个从SQL转换到BigTable的新手,所以我在转换过程中肯定犯了一些错误。我已经学会了提前知道你最终想要对数据做什么的重要性(我希望我的老板能告诉我他想要我对数据做什么,这将非常有帮助)。再次感谢你对这个模糊问题的回答。1)很有趣。。。我不知道那会有帮助。我认为(但如果我完全错了,我会被取笑)写操作的数量取决于数据结构和索引,而不是我实际调用datastore.Put()方法的频率。2)我没有意识到有一个“可靠的”memcache,我读的文档说使用memcache,好像数据随时都可能消失。如果这是真的,那么我暂时保存在memcache中的数据是否完全有可能丢失?我不能丢失这些数据,尽管我想我可以在将其写入数据存储之前对其进行验证。我的策略是在我将数据从数据存储中取出后将其存储在内存中,但在我向数据存储写入更新后将其从memcache中删除。1)这是因为您将数据存储写入操作减少了。让我澄清一下,不是直接将N行写入数据存储,而是将它们写入memcache中的单个条目,当它几乎满时,将memcache中的条目写入数据存储中的单个条目。这将减少数据存储操作。然而,只有当您的条目很小(但很多条目)并且缺点是您无法查询回来时,这才有效。2.理论上可能,这只是基于我的经验,专用的更可靠。因为你有一个专用的尺寸,而不是与其他应用共享。我想我很困惑。如果无法查询,为什么要存储某个内容?我肯定需要重新查询我存储的数据,我创建它的全部原因首先是为我的用户提供一个可过滤的报告。我的数据包含日期、部门、位置等值,并附有数字值。因此,我的报告需要能够提取给定日期范围、部门、位置等的所有条目,并将所有数值相加(并显示其他几个字符串值),因此它肯定需要可查询。出于分析目的,您不需要从appengine进行查询。因此,以最便宜的方式存储它,并将其转储到另一个为分析而构建的数据库:)