MIT6.824-Lab1-Part II: Single-worker word count

1.概述

在main/wc.go中有空的mapF()和reduceF()函數,Part II的內容就是實現這兩個函數,以統計每一個單詞出現的次數,區分大小寫。替換掉Part I中的MapFunc和ReduceFunc。
在~/6.824/src/main中有一些名稱相似pg-*.txt的文件,這即是Part II要處理的輸入文件,運行下列命令來測試程序bash

cd 6.824
export "GOPATH=$PWD"
cd "$GOPATH/src/main"
go run wc.go master sequential pg-*.txtapp

最終的輸出文件是mrtmp.wcseq,若程序編寫正確,最終讀取mrtmp.wcseq能夠獲得以下結果函數

sort -n -k2 mrtmp.wcseq | tail -10
that: 7871
it: 7987
in: 8415
was: 8578
a: 13382
of: 13536
I: 14296
to: 16079
and: 23612
the: 29748測試

2.mapF()

對每一個輸入文件會調用一次mapF,第一個參數是文件名,第二個參數是文件的內容,最後返回鍵值對切片。ui

func mapF(filename string, contents string) []mapreduce.KeyValue {
    // Your code here (Part II).
}
複製代碼

返回的鍵值對切片中,Kay存放的是單詞,Value存放的是這個單詞在這篇文章中出現的次數。使用strings.Fields方法對輸入文件的內容進行分割.還有須要注意的一點是,須要將標點符號進行替換,以避免在按間隔符分割獲得單詞後,因爲存在標點符號問題不能匹配成功。實現以下(ps.比較好的方式是使用strings.FieldsFunc):spa

func mapF(filename string, contents string) []mapreduce.KeyValue {
    //刪除,.?等等標點符號
    re, _ := regexp.Compile("[^a-z^A-Z]")
    contents = re.ReplaceAllString(contents, " ")

    var kv map[string]int
    kv = make(map[string]int)
    words := strings.Fields(contents)
    for _, w := range words {
        if _,ok := kv[w];ok {//word已經存在,計數累加
            kv[w] +=1
        }else {
                kv[w] =1
        }
    }
    //轉換爲[]mapreduce.KeyValue
    var res []mapreduce.KeyValue
    for k,v := range kv {
        res = append(res,mapreduce.KeyValue{k,strconv.Itoa(v)})
    }

    return res
}
複製代碼

3.reduceF()

reduceF()對map tasks產生的每個key都調用一次,values存放的是key在不一樣輸入文件中出現的次數.在reduceF將values都相加而後返回就是每一個單詞在全部文件中出現的次數。code

func reduceF(key string, values []string) string {
    // Your code here (Part II).
}
複製代碼

實現以下regexp

func reduceF(key string, values []string) string {
    total := 0
    for _,v := range values {
        i, err := strconv.Atoi(v)
        if err!=nil {
            fmt.Println(err)
        }
        total += i
    }
    return strconv.Itoa(total)
}
複製代碼

4.測試運行

cd "$GOPATH/src/main"
time go run wc.go master sequential pg-*.txtcdn

出現相似下面結果運行成功blog

查看生成的結果文件mrtmp.wcseq,能與下面內容一致則說明程序運行正確

sort -n -k2 mrtmp.wcseq | tail -10
that: 7871
it: 7987
in: 8415
was: 8578
a: 13382
of: 13536
I: 14296
to: 16079
and: 23612
the: 29748

或者直接運行這個腳本測試

bash ./test-wc.sh

相關文章
相關標籤/搜索