使实体在Python云数据上持续缓慢

2024-06-26 14:47:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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。在

这不是推荐的做法吗?我应该做什么呢?在

更多信息:

我当前不在事务中包装Entityputput只是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字段上,它是对不同数据库中另一个对象的引用,以便跨数据库查找。在


Tags: 数据对象key实体idhereputds
2条回答

除了另一个答案中的分批推荐,还有其他的练习可以减少你的“放置”时间。在

当您对数据存储执行“写入”操作时,实际上是将数据多次写入多个表(索引)以提高性能。通过牺牲一些写入时间效率和存储空间,数据存储针对查询时间性能进行了优化。例如,如果索引了三个普通字段,则每次写入操作基本上都会更新三个(排序的)表。通常不会被查询的字段应该not be indexed,这将节省您的时间和金钱。在

“过度索引”的效果在重复或嵌套字段时会更糟,因为“索引爆炸”的效果。基本上,数据在存储之前是“扁平化”的,因此具有多个重复字段将导致写入成本和时间的成倍增加。在

您可以使用Batch operations提高多个连续写入(以及读取)的性能:

Batch operations

Cloud Datastore supports batch versions of the operations which allow it to operate on multiple objects in a single Cloud Datastore call.

Such batch calls are faster than making separate calls for each individual entity because they incur the overhead for only one service call. If multiple entity groups are involved, the work for all the groups is performed in parallel on the server side.

client.put_multi([task1, task2])

相关问题 更多 >