Go中的并行不同字数

时间:2011-06-22 07:10:20

标签: language-agnostic parallel-processing go word-count

JakobØstergaardpresented这一挑战:

  

编写一个从标准输入读取文本的程序,并返回(打印)文本中找到的不同单词的总数。

我们如何通过并行编程来应对这一挑战(最好是在Go中,但用英语描述就足够了)?

2 个答案:

答案 0 :(得分:3)

有几种可能性,但我想你的意思是“有效”?

一般的想法是将文本拆分为可管理的块,将这些块堆积到一个队列中,并让多个消费者处理这些块。

这对我来说就像是一个典型的Map / Reduce应用程序:

          _ Worker_
         /          \
        /            \
Splitter--- Worker ---Aggregator
        \            /
         \_ Worker _/

理想情况下,“多个”队列将是一个具有多个消费者的队列,因此如果一个工作人员减速,整个过程的速度就不会减慢。

我还会使用Splitter向Workers发出的信号让他们知道输入已被完全消耗,他们可以开始将结果发送给聚合器。

答案 1 :(得分:1)

以下是Go中的解决方案Jakob Østergaard's problem

/*
    The problem: Write a program that reads text from 
    standard-input, and returns (prints) the total 
    number of distinct words found in the text. 

    C versus C++, Jakob Østergaard, February 24th, 2004
    http://unthought.net/c++/c_vs_c++.html
*/

package main

import (
    "bufio"
    "fmt"
    "os"
    "unicode"
)

func main() {
    rdr := bufio.NewReader(os.Stdin)
    words := make(map[string]bool, 1024*1024)
    word := make([]int, 0, 256)
    for {
        r, n, _ := rdr.ReadRune()
        if unicode.IsSpace(r) || n == 0 {
            if len(word) > 0 {
                words[string(word)] = true
                word = word[:0]
            }
            if n == 0 {
                break
            }
        } else {
            word = append(word, r)
        }
    }
    fmt.Println(len(words))
}

将“并行编程”这一短语添加到此问题和其他大多数问题并期待一些神奇的改进是天真的。从流中顺序读取输入并执行琐碎计算不会为parallel computing提供重要机会。