我需要在数据存储区中对相对较大的数据集执行夜间更新(使用GAE同步公司数据的子集)。我一直在使用bulkloader,它完成了这项工作,但写入成本确实在增加。由于我为每个实体指定了关键字符串,因此批量加载器实际上是为它加载的每个记录重写ENTIRE实体,在我的例子中,它是大约90个写入PER ENTITY。 (它是一个包含大量索引的大型平面数据集。)但是在我的数据集中,我的50个属性中只有六个实际上在一夜之间发生了变化,所以我做了很多多余的写作。
我的第一个想法是保留前一晚构建的缓存,循环进行更改,获取实体,然后对需要它的属性执行put()。这有效地减少了写入,但需要很长时间 - 即使我批量put()。使用bulkloader加载整个数据集只需要大约3分钟 - 而16-18只是为了运行更新! (我正在使用远程API,BTW。)当我扩展时,这不会起作用。
我尝试在我的模型中使用ndb.KeyProperty并且只通过bulkloader更新已更改的字段,但后来我失去了对keyProperty进行查询/排序的能力,这是我需要的。
我还尝试过StructuredProperties,它允许你查询/排序,但结构化属性不允许你为它设置ID,所以我不能只加载结构化属性。
那么......有没有办法让我减少这些写入并保留我需要的功能?我可以使用bulkloader仅更新更改吗?我需要重构我的数据集吗?