Go 将多个映射合并到一个映射中,该映射的给定键的值是组合映射中该键的值之和

Go 将多个映射合并到一个映射中,该映射的给定键的值是组合映射中该键的值之和,go,Go,我编写了一个程序,识别文本文档中的所有唯一单词,并计算每个单词出现的次数。为了提高我的程序的性能,我尝试将单词计数分解为几个可以并行运行的goroutine 最初,我尝试使用一个通过引用传递给每个goroutine的映射,其中每个goroutine都会计算文档中的单词数。这导致了恐慌,因为程序试图同时从多个goroutine写入同一映射。为了解决这个问题,我创建了一个互斥锁,可以防止多个goroutine同时写入映射。此时,程序按预期运行,但与WordCount功能的原始顺序实现相比,没有性能差

我编写了一个程序,识别文本文档中的所有唯一单词,并计算每个单词出现的次数。为了提高我的程序的性能,我尝试将单词计数分解为几个可以并行运行的goroutine

最初,我尝试使用一个通过引用传递给每个goroutine的映射,其中每个goroutine都会计算文档中的单词数。这导致了恐慌,因为程序试图同时从多个goroutine写入同一映射。为了解决这个问题,我创建了一个互斥锁,可以防止多个goroutine同时写入映射。此时,程序按预期运行,但与
WordCount
功能的原始顺序实现相比,没有性能差异。仔细想想,这并不奇怪,因为互斥体迫使其他goroutine在写入映射之前等待,因此阻止了并行计算

下面的代码使用互斥来避免所描述的运行时死机,但也无法并行计算字数

func WordCount(单词[]字符串、起始字符串、结束单词、频率映射[string]int、waitGroup*sync.waitGroup、mutex*sync.mutex){
互斥锁
对于i:=startWord;i对于i:=1;i我相信您可以创建一个映射数组,每个映射用于每个进程,然后使用列表读取每个映射,以跟踪已计数的单词。假设每个单词都是计数次数的关键,这就是它的外观。

考虑到并发方面,这里的并行处理可能不是最好的选择,因为为了真正提高性能,所有的事情都需要分开。如果你有存储空间,那么你肯定可以使用一个列表,在最坏的情况下得到O(N)地图集成的效率。您需要在单个线程或单个进程中保持地图的集成。

我相信您可以创建一个地图数组,每个地图用于每个进程,然后使用列表读取每个地图,以跟踪您已经统计的单词。假设每个单词都是关键是计数的次数,这就是它的外观。 考虑到并发方面,这里的并行处理可能不是最好的选择,因为为了真正提高性能,所有的事情都需要分开。如果你有存储空间,那么你肯定可以使用一个列表,在最坏的情况下得到O(N)地图集成的效率。您需要将地图集成保持在单个线程或单个进程中