账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Go 把数据库结果大量数据 到结构体,龟速
    • 2019-10-05 00:00
    • 10
    30
    0

    在使用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()
    }
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 烈酒孤独 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部