我在python3灵活的appengine环境中通过Python库使用Google云数据存储。我的flask应用程序创建一个对象,然后将其添加到数据存储中:
ds = datastore.Client()
ds.put(entity)
在我的测试中,每次调用put
需要0.5-1.5秒才能完成。如果我像here一样一个接一个地进行两个调用,这不会改变。在
我想知道我的对象的复杂性是否是问题所在。它是多层次的,比如:
^{pr2}$我是通过嵌套datastore.Entity
来创建的,每一个初始化都类似于:
entity = datastore.Entity(key=ds.key(KIND))
entity.update(object_dictionary)
两个列表都有3-4个项目。对象的JSON等价物为~2-3kb。在
这不是推荐的做法吗?我应该做什么呢?在
更多信息:
我当前不在事务中包装Entity
的put
。put只是put_multi
上的一个薄包装。put_multi似乎创建了一个batch
,发送{
我没有指定对象的“Name/ID”(来自datastoreonline控制台的标题)。我允许图书馆为我决定:
datastore.key(KIND)
其中KIND
只是一个指定集合名称的字符串。替代方法是:
datastore.key(KIND, <some ID>)
我用它来更新对象,而不是我最初创建对象的地方。库生成的密钥随时间而增加,但不是单调的(例如:id=4669294231158784,id=4686973524508672)。在
我不能百分之百地确定我所做的工作的术语(“实体是否在同一个实体组中,或者如果您使用索引属性”),但是人们似乎把这个过程称为“嵌入的实体”(即here)。在datastoreonline控制台中,在entities部分下,我只有一个“kind”,而不是每个子对象的多个类型。这能回答你的问题吗?还是我能找到答案?在
我在集合上只有一个索引,在一个单独的ID字段上,它是对不同数据库中另一个对象的引用,以便跨数据库查找。在
除了另一个答案中的分批推荐,还有其他的练习可以减少你的“放置”时间。在
当您对数据存储执行“写入”操作时,实际上是将数据多次写入多个表(索引)以提高性能。通过牺牲一些写入时间效率和存储空间,数据存储针对查询时间性能进行了优化。例如,如果索引了三个普通字段,则每次写入操作基本上都会更新三个(排序的)表。通常不会被查询的字段应该not be indexed,这将节省您的时间和金钱。在
“过度索引”的效果在重复或嵌套字段时会更糟,因为“索引爆炸”的效果。基本上,数据在存储之前是“扁平化”的,因此具有多个重复字段将导致写入成本和时间的成倍增加。在
您可以使用Batch operations提高多个连续写入(以及读取)的性能:
相关问题 更多 >
编程相关推荐