为了账号安全,请及时绑定邮箱和手机立即绑定

Golang中的地图访问瓶颈

Golang中的地图访问瓶颈

Go
jeck猫 2021-07-10 19:00:31
我正在使用 Golang 为具有超过 30000 个可能标签的数据集实现朴素贝叶斯分类。我已经建立了模型,我正处于分类阶段。我正在对 1000 条记录进行分类,这最多需要 5 分钟。我已经使用 pprof 功能对代码进行了分析;前 10 名如下所示:Total: 28896 samples   16408  56.8%  56.8%    24129  83.5% runtime.mapaccess1_faststr    4977  17.2%  74.0%     4977  17.2% runtime.aeshashbody    2552   8.8%  82.8%     2552   8.8% runtime.memeqbody    1468   5.1%  87.9%    28112  97.3% main.(*Classifier).calcProbs     861   3.0%  90.9%      861   3.0% math.Log     435   1.5%  92.4%      435   1.5% runtime.markspan     267   0.9%  93.3%      302   1.0% MHeap_AllocLocked     187   0.6%  94.0%      187   0.6% runtime.aeshashstr     183   0.6%  94.6%     1137   3.9% runtime.mallocgc     127   0.4%  95.0%      988   3.4% math.log10令人惊讶的是,地图访问似乎是瓶颈。有没有人经历过这个。还有什么其他的键值数据结构可以用来避免这个瓶颈?所有地图访问都在下面给出的以下代码段中完成:func (nb *Classifier) calcProbs(data string) *BoundedPriorityQueue{    probs := &BoundedPriorityQueue{}     heap.Init(probs)    terms := strings.Split(data, " ")    for class, prob := range nb.classProb{        condProb := prob        clsProbs := nb.model[class]        for _, term := range terms{            termProb := clsProbs[term]            if termProb != 0{                condProb += math.Log10(termProb)            }else{                condProb += -6 //math.Log10(0.000001)            }        }       entry := &Item{            value: class,            priority: condProb,        }        heap.Push(probs,entry)    }    return probs}映射是 nb.classProb,map[string]float64而 nb.model 是类型的嵌套映射map[string]map[string]float64
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

除了@tomwilde 所说的之外,另一种可以加快算法速度的方法是字符串实习。也就是说,如果您提前知道键的域,则可以完全避免使用映射。我写了一个小包,可以为你做字符串实习。


查看完整回答
反对 回复 2021-07-19
  • 2 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信