Go 把数据库结果大量数据 到结构体,龟速

在使用mongo数据库的时候,查询数据,结果大概有2万多条,
有个方法是 自动把query的结构映射到结构体中的。这两万多条,时间久不说了,1分多,还数据残缺。

var dbresult []MogoResp
error := c.Find(bson.M{"currcode": "903"}).All(&dbresult)

就这么两句代码,卡了超过一分多。mongo是使用索引,得到结果是极其快。就是把结果转为 结构体 数组的时候,龟速龟速。
这个mongo的操作工具是 gopkg.in/mgo.v2。
怎么可能这么慢呢,真是出了奇,求指教.....

===========================

感觉源码使用了反射,导致查出 2万多条数据,用了将近2分钟。

func (iter *Iter) All(result interface{}) error {
    resultv := reflect.ValueOf(result)
    if resultv.Kind() != reflect.Ptr || resultv.Elem().Kind() != reflect.Slice {
        panic("result argument must be a slice address")
    }
    slicev := resultv.Elem()
    slicev = slicev.Slice(0, slicev.Cap())
    elemt := slicev.Type().Elem()
    i := 0
    for {
        if slicev.Len() == i {
            elemp := reflect.New(elemt)
            if !iter.Next(elemp.Interface()) {
                break
            }
            slicev = reflect.Append(slicev, elemp.Elem())
            slicev = slicev.Slice(0, slicev.Cap())
        } else {
            if !iter.Next(slicev.Index(i).Addr().Interface()) {
                break
            }
        }
        i++
    }
    resultv.Elem().Set(slicev.Slice(0, i))
    return iter.Close()
}
阅读 3k
1 个回答

试试一个方法,dbresult 提前 make 出 20000 的空间。

dbresult = make([]MogoResp, 0, 20000)

这样可以减少内存分配,但或许不是主要问题,建议你可以使用 pprof 工具分析下。

还有,这个库我没用过,提个想法,能不能确定下 mongo 手动执行和程序执行的是一样的语句。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏