Jon*_*n G 5 python google-app-engine python-3.x google-cloud-datastore google-cloud-platform
我在Python 3灵活的应用引擎环境中通过Python库使用Google Cloud Datastore.我的烧瓶应用程序创建一个对象,然后将其添加到数据存储区:
ds = datastore.Client()
ds.put(entity)
Run Code Online (Sandbox Code Playgroud)
在我的测试中,每次调用put需要0.5-1.5秒才能完成.如果我像这里一个接一个地立即拨打两个电话,这不会改变.
我想知道我的对象的复杂性是否是问题.它是多层次的,例如:
object = {
a: 1,
...,
b: [
{
d: 2,
...,
e: {
h: 3
}
}
],
c: [
{
f: 4,
...,
g: {
i: 5
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
我通过嵌套创建datastore.Entity的,每个都初始化为:
entity = datastore.Entity(key=ds.key(KIND))
entity.update(object_dictionary)
Run Code Online (Sandbox Code Playgroud)
两个列表都是3-4个项目.对象的JSON等价物是~2-3kb.
这不是推荐的做法吗?我应该做什么呢?
更多信息:
我目前没有把这个包put的Entity事务中.put只是一个薄薄的包装put_multi.put_multi似乎创建一个batch,发送Entity,然后提交batch.
我没有指定对象的"名称/ ID"(来自数据存储在线控制台的标题).我允许图书馆为我决定:
datastore.key(KIND)
Run Code Online (Sandbox Code Playgroud)
where KIND只是一个指定我的集合名称的字符串.替代方案是:
datastore.key(KIND, <some ID>)
Run Code Online (Sandbox Code Playgroud)
我用它来更新对象,而不是我最初创建对象的地方.库生成的密钥随时间增加,但不是单调增加的(例如:id = 4669294231158784,id = 4686973524508672).
我不是百分之百确定我所做的术语("实体是在同一个实体组中,或者如果你使用索引属性"),但人们似乎将该过程称为"嵌入式实体"(即在这里).在数据存储在线控制台中,在实体部分下,我只有一个"种类",而不是每个子对象有多种.这是回答你的问题,还是我能以某种方式找到它?
我在集合上只有一个索引,在一个单独的ID字段上,该字段是对不同数据库中另一个对象的引用,用于跨数据库查找.
您可以通过使用批处理操作来提高多个连续写入(以及读取)的性能:
批量操作
Cloud Datastore 支持操作的批处理版本,这允许它在单个 Cloud Datastore 调用中对多个对象进行操作。
这种批量调用比对每个单独的实体进行单独调用更快,因为它们只产生一次服务调用的开销。如果涉及多个实体组,则所有组的工作在服务器端并行执行。
Run Code Online (Sandbox Code Playgroud)client.put_multi([task1, task2])
| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |