Google app engine GAE/Go:数据存储迭代器太慢
GAE/Go中对数据存储查询结果的迭代非常缓慢Google app engine GAE/Go:数据存储迭代器太慢,google-app-engine,go,google-cloud-datastore,Google App Engine,Go,Google Cloud Datastore,GAE/Go中对数据存储查询结果的迭代非常缓慢 q := datastore.NewQuery("MyStruct") gaeLog.Infof(ctx, "run") // (1) it := client.Run(ctx, q) list := make([]MyStruct, 0, 10000) gaeLog.Infof(ctx, "start mapping")
q := datastore.NewQuery("MyStruct")
gaeLog.Infof(ctx, "run") // (1)
it := client.Run(ctx, q)
list := make([]MyStruct, 0, 10000)
gaeLog.Infof(ctx, "start mapping") // (2)
for {
var m MyStruct
_, err := it.Next(&m)
if err == iterator.Done {
break
}
if err != nil {
gaeLog.Errorf(ctx, "datastore read error : %s ", err.Error())
<some error handling>
break
}
list = append(list , m)
}
gaeLog.Infof(ctx, "end mapping. count : %d", len(list)) // (3)
在(2)
和(3)
之间大约需要4.5秒,只有2400条记录。它非常慢
q := datastore.NewQuery("MyStruct")
gaeLog.Infof(ctx, "run") // (1)
it := client.Run(ctx, q)
list := make([]MyStruct, 0, 10000)
gaeLog.Infof(ctx, "start mapping") // (2)
for {
var m MyStruct
_, err := it.Next(&m)
if err == iterator.Done {
break
}
if err != nil {
gaeLog.Errorf(ctx, "datastore read error : %s ", err.Error())
<some error handling>
break
}
list = append(list , m)
}
gaeLog.Infof(ctx, "end mapping. count : %d", len(list)) // (3)
如何提高性能
[更新]
我在上面的代码q:=datastore.NewQuery(“MyStruct”)
中添加了查询。
我试图检索种类
MyStruct
中的所有实体。这种类型有2400个实体。我使用的是cloud.google.com/go/datastore
,发现速度很慢。我迁移到使用google.golang.org/appengine/datastore
结果如下,不到1秒
13:57:46.216 run
13:57:46.367 start mapping
13:57:47.063 end mapping. count : 2400
很难如实回答这个问题。数据库查询的速度取决于数据库的索引和查询的细节。这些细节都没有出现在问题中。@PaulHankin where花费的时间介于(2)和(3)之间,即在client.Run完成之后。我想你是说4.5s不能成为数据库,因为你认为
client.Run
一次完成了数据库中的所有查找。这可能是错误的——取决于您的索引和查询,it.Next()
可能会执行更多的数据库查找。@PaulHankin我明白了,我当然认为所有的查找都将由客户端完成。运行
。我已经更新了我的帖子,添加了查询细节和数据存储类型。我唯一想到的是,您可能应该将列表更改为[]*MyStruct
,并将var m*MyStruct
。我相信append
正在复制结构,因为您是按值传递它的。