猿问

Golang中的地图访问瓶颈

我正在使用 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


jeck猫
浏览 234回答 2
2回答

米脂

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

相关分类

Go
我要回答