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

前往:重用地图键时大量的内存使用

前往:重用地图键时大量的内存使用

Go
潇湘沐 2021-05-07 17:10:59
作为我的Go教程的一部分,我正在编写简单的程序来计算多个文件中的单词。我有一些go例程,用于处理文件和创建map[string]int告诉已发现特定单词的次数。然后将映射发送到约简例程,该例程将值聚合到单个映射中。听起来很简单,看起来像Go的完美任务(减少地图操作)!我大约有1万个文档,其中包含160万个唯一单词。我发现我的内存使用量在运行代码时快速且持续地增长,而我的内存用完了大约一半的处理时间(12GB盒装,7GB可用空间)。所以是的,它为这个小数据集使用了千兆字节!试图找出问题出在哪里,我发现归咎于reduceer收集和汇总数据。代码如下:func reduceWords (input chan map[string]int, output chan int) {  total := make(map[string]int)  for wordMap := range input {    for w, c := range wordMap {      total[w] += c    }  }        output <- len(total)}如果我从样本上方删除地图,则内存将保持在合理的范围内(几百兆字节)。不过,我发现对字符串进行复制也可以解决问题,即以下示例不会占用我的内存:func reduceWords (input chan map[string]int, output chan int) {  total := make(map[string]int)  for wordMap := range input {    for w, c := range wordMap {      copyW := make([]byte, len(w)) // <-- will put a copy here!      copy(copyW, w)      total[string(copyW)] += c    }  }    output <- len(total)}wordMap当我直接使用该值时,是否有可能是实例在每次迭代后都没有被破坏?(作为C ++程序员,在使用GC时我的直觉很有限。)这是否值得期待?难道我做错了什么?我应该对Go还是对自己感到失望?
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您的代码看起来像什么,将文件转换为字符串?我在那里找问题。如果要将大块(可能是整个文件?)转换为字符串,然后将其切成单词,那么如果保存任何一个单词,则将固定整个块。尝试将块保留为[] byte,将其切成单词,然后将单词分别转换为字符串类型。


查看完整回答
反对 回复 2021-05-10
  • 1 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

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