趣味集算 wordcount

2021-09-13 02:26:05 字數 3166 閱讀 7089

wordcount 差不多是最常用的分布式系統練習程式了,hadoop 就經常用這個當例子。我們來看用集算器怎麼做 wordcount。

例如,d:\files\novel 目錄中,有一些**文件,現在,需要統計這些**中哪些單詞最為常用:

在集算器中,如果不嫌寫得長,只要一句**就可以搞定了:a1

=directory@p(「d:/files/novel」).(file().read().words().groups(lower():word;count(~):count)).merge(word).groups@o(word;sum(count):count).sort@z(count)

怎麼樣,是不是超級簡單?計算後,a1 中得到的結果如下:

不過,這句確實有點長,為了便於理解,我們可以把它拆成多步來執行:ab

c1=directory@p(「d:/files/novel」)

=now()

2for a1

=file(a2).read().words()

3=b2.groups(lower():word;count():count)

4>b1=b1

[b3]

5=b1.merge(word)

=a5.groups@o(word;sum(count):count).sort@z(count)

=interval@ms(c1,now())

在 a1 中,列出目錄中的各個檔案:

第 2~4 行迴圈統計每個檔案中的單詞。b2 中讀取檔案中的文字並拆分成單詞:

b3 中統計出當前文件中每個單詞出現的次數,統計時將單詞轉換為小寫字母,以避免大小寫變化的影響。結果將按照單詞的字典順序排列:

在每個文件統計完成後,在 b4 中將結果記錄到 b1 中,所有文件統計後,b1 中結果如下:

在 a5 中,將這些結果按照每個單詞歸併起來,結果如下:

b5 中,將歸併後的統計結果按每個單詞聚合計算,再將結果按 count 降序排列,可以得到和前面單條語句時相同的結果:

在 c1 和 c5 中,通過記錄執行開始前後的時刻,估算出計算所需的毫秒數如下:

可見,執行效率還是非常高的。

平行計算會不會麻煩很多啊?看看**吧:ab

c1=directory@p(「d:/files/novel」)

=now()

2fork a1

=file(a2).read().words()

3=b2.groups(lower(~):word;count(~):count)

4=a2.merge(word)

=a4.groups@o(word;sum(count):count).sort@z(count)

=interval@ms(c1,now())

嗯,好象差不多嘛,就是把 a2 的那個 for 換成了 fork,其它**基本沒什麼變化。看看 c4 中的計時情況

果然快了,並行真地起了作用(俺的筆記本只有雙核,有這個效能提高也就差不多了)。

這個 fork 語句就會自動把本來單執行緒序列執行的 for 迴圈變成多執行緒並行迴圈計算,程式設計師完全不用操心執行緒管理的事,是不是很簡單?

懶得真搞多個伺服器來,就用一台機器啟動多個程序模擬一下吧。在集算器安裝目錄的 esproc\bin 路徑下,可以找到 esprocs.exe 檔案,可以直接執行它來啟動或配置伺服器:

配置完成後,就可以回到伺服器主視窗啟動伺服器。重複執行 esprocs.exe 可以再啟動兩個伺服器,這 3 個伺服器將依次使用配置中設定的 ip 和埠。這樣單機上的伺服器集群就準備完畢了。

下面準備統計 4 個路徑中所有文件的單詞,由於這裡使用單機模擬伺服器集群的,所以每個伺服器都是共用相同路徑的,如果是遠端伺服器,設定時路徑可能也會有所差異。ab

c1[192.168.10.229:4001,192.168.10.229:4004,192.168.10.229:4007]

[d:/files/novel1,d:/files/novel2, d:/files/novel3,d:/files/novel4]

2fork b1;a1

=directory@p(a2)

3fork b2

=file(b3).read().words()

4=c3.groups(lower():word;count():count)

5return b3.merge(word)

6=a2.merge(word)

=a6.groups@o(word;sum(count):count).sort@z(count)

在計算時,用 4 個檔案路徑作為引數,需要執行 4 個子任務分別計算某個路徑中檔案的單詞數。只需要在 fork 後面加上各個伺服器節點的位址,這些子任務就可以由集算器自動分派給伺服器節點去計算並將結果彙總,程式設計師根本不用操心這些小問題。最後在 b6 中計算出結果如下:

從各個伺服器視窗中,可以看到集群計算任務的分配執**況:

怎麼樣?很簡單吧,hadoop 還沒搭建起來的時間,咱已經把活幹完了。

趣味百道之巧算末位

今天做了幾道趣味百題,發現一些很有意思的演算法,其實不如說是理解方式,理解題意並從另乙個角度破題,成為這幾題菜鳥玩家的首選 首先第六題,題目設計讓求13 13,如果按照我開始的想法,用遞迴求結果再取餘,就會出現負數的結果,後來找到了另一種邊做乘邊取餘,因為每次計算只有後三位對題目要求有幫助,所以用迴...

巧用集算器資料集

看如下圖所示報表 這個報表從樣式來看,可以看作是乙個簡單的網格式報表,統計著各種收支金額,但因為取數複雜,每個格仔的資料都來自乙個複雜的 sql 資料集,並且涉及十幾個,乃至幾十個資料集,藍色 區域裡每個格仔都需要從各自的資料集裡檢索遍歷,查詢與左表頭關聯的記錄。為了方便體會這一點,我們將上圖報表簡...

趣味集算 算二十四

算24點,是一種常見的智力遊戲。它可以使用抽去大小王的撲克牌來玩,隨便抽出4張牌,要求通過加 減 乘 除等四則運算,並使用所有的這4個數,將結果算為24。在玩這個遊戲時,撲克牌中的jqk記為11,12和13。用集算器,可以比較方便地編寫程式,根據隨便給定的4個數,計算出遊戲的解答,如下面的24poi...