Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory Go:重用映射键时的大量内存使用_Memory_Map_Go - Fatal编程技术网

Memory Go:重用映射键时的大量内存使用

Memory Go:重用映射键时的大量内存使用,memory,map,go,Memory,Map,Go,作为围棋教程的一部分,我正在编写一个简单的程序,在多个文件中计算单词。我有一些go例程用于处理文件和创建map[string]int来告诉我们找到了多少个特定单词。然后将映射发送到reduce例程,该例程将值聚合到单个映射。听起来很简单,看起来像是一个完美的(地图减少)任务去 我有大约10000个文档,其中包含160万个独特的单词。我发现在运行代码的过程中,我的内存使用率一直在快速增长,而我的内存在处理过程的一半时就用完了(12GB的内存,7GB的可用内存)。所以是的,它使用千兆字节作为这个小数

作为围棋教程的一部分,我正在编写一个简单的程序,在多个文件中计算单词。我有一些go例程用于处理文件和创建
map[string]int
来告诉我们找到了多少个特定单词。然后将映射发送到reduce例程,该例程将值聚合到单个映射。听起来很简单,看起来像是一个完美的(地图减少)任务去

我有大约10000个文档,其中包含160万个独特的单词。我发现在运行代码的过程中,我的内存使用率一直在快速增长,而我的内存在处理过程的一半时就用完了(12GB的内存,7GB的可用内存)。所以是的,它使用千兆字节作为这个小数据集

为了找出问题所在,我发现应该归咎于收集和聚合数据的减速器。下面是代码:

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(输入chan-map[string]int,输出chan-int){
总计:=make(映射[string]int)
对于wordMap:=范围输入{
对于w,c:=范围字映射{
总计[w]+=c
}
}      

输出将文件转换为字符串的代码是什么样子的?我会在那里查找问题。如果您将大的块(可能是整个文件?)转换为字符串,然后将其切片为单词,那么如果保存任何一个单词,您将固定整个块。尝试将块保留为[]字节,将它们切分为单词,然后分别将单词转换为字符串类型。

凭直觉,这是问题本身!我忘了从现在起我必须分片思考。我一开始就将每个文件转换为字符串,因为我发现速度更快,但没有意识到这是错误的。谢谢帮助!@tomasz这应该是不可能的le使程序的总内存消耗大大超过程序读取的文件大小之和。我假设每个不同的文件只读取一次。这些10k文档的总大小是多少?是否超过1 GB?
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)
}