Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python App Engine Bulkloader更新实体而不是替换实体_Python_Google App Engine_Google Cloud Datastore_Bulkloader - Fatal编程技术网

Python App Engine Bulkloader更新实体而不是替换实体

Python App Engine Bulkloader更新实体而不是替换实体,python,google-app-engine,google-cloud-datastore,bulkloader,Python,Google App Engine,Google Cloud Datastore,Bulkloader,我需要在相对较大的数据集上执行数据存储的夜间更新(将公司数据的子集与GAE同步)。我一直在使用bulkloader,它完成了这项工作,但写成本确实在增加。因为我为每个实体指定键字符串,所以bulkloader实际上是为它加载的每个记录重写整个实体,在我的例子中,每个实体大约写90次。(这是一个大而扁平的数据集,有很多索引。)但在我的数据集中,50个属性中只有6个在一夜之间发生了变化,所以我做了大量的冗余编写 我的第一个想法是保留前一晚构建的缓存,在其中循环更改,获取实体,然后对需要它的属性执行p

我需要在相对较大的数据集上执行数据存储的夜间更新(将公司数据的子集与GAE同步)。我一直在使用bulkloader,它完成了这项工作,但写成本确实在增加。因为我为每个实体指定键字符串,所以bulkloader实际上是为它加载的每个记录重写整个实体,在我的例子中,每个实体大约写90次。(这是一个大而扁平的数据集,有很多索引。)但在我的数据集中,50个属性中只有6个在一夜之间发生了变化,所以我做了大量的冗余编写

我的第一个想法是保留前一晚构建的缓存,在其中循环更改,获取实体,然后对需要它的属性执行put()。这可以有效地减少写操作,但需要很长时间——即使在批处理put()时也是如此。用bulkloader加载整个数据集只需3分钟,而运行更新只需16-18分钟!(我正在使用远程API,顺便说一句)当我放大时,这将不起作用

我尝试在我的模型中使用ndb.KeyProperty,只通过bulkloader更新更改的字段,但随后我失去了对keyperty进行查询/排序的能力,这正是我所需要的

我还尝试了StructuredProperties,它允许您进行查询/排序,但structured属性不允许您为其设置ID,因此我无法仅加载structured属性


那么…有没有办法减少这些写操作并保留所需的功能?我可以使用bulkloader仅更新更改吗?我是否需要重新构造数据集???

即使只更改一个属性,也无法执行部分写入操作,您将重写整个实体和索引。如果它每次都更新相同的属性子集,那么您可以考虑将这些存储在父实体为主记录的子实体中,并且只更新那些子记录。该死的,您是对的:DATASTORE API不区分创建新实体和更新现有实体。如果对象的键表示已存在的实体,则put()方法将覆盖现有实体。您可以使用事务来测试具有给定密钥的实体是否存在,然后再创建一个实体。另请参见Model.get\u或\u insert()方法。

使用子/父方法的问题是我牺牲了查询/排序功能。。。