• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            陳碩的Blog

            muduo多機(jī)協(xié)作網(wǎng)絡(luò)編程示例一:?jiǎn)卧~計(jì)數(shù)及排序

            去年我寫了《Muduo 網(wǎng)絡(luò)編程示例》系列文章,這些文章已經(jīng)收入《Linux 多線程服務(wù)端編程:使用 muduo C++ 網(wǎng)絡(luò)庫(kù)》一書。這些文章講的基本都是運(yùn)行在單機(jī)上的網(wǎng)絡(luò)程序,每個(gè)例子都只有一個(gè)程序(第7.13節(jié)例外)。我接下來(lái)打算繼續(xù)寫幾篇文章,談一談分布在多臺(tái)機(jī)器上、協(xié)作發(fā)揮作用的網(wǎng)絡(luò)編程例子。

            今天先講第一個(gè),單詞計(jì)數(shù)及排序。單詞計(jì)數(shù)(word count),顧名思義就是統(tǒng)計(jì)一個(gè)文本文件里邊每個(gè)詞出現(xiàn)了多少次。排序指的是按出現(xiàn)次數(shù)從多到少排序,也可以把問(wèn)題改為“找出出現(xiàn)次數(shù)最多的1000個(gè)單詞”。

            這個(gè)問(wèn)題有三個(gè)層次,第一是輸入文件比較小,能完全放入內(nèi)存;第二是輸入文件比較大,不能一次性都放入內(nèi)存;第三是輸入文件分布在多臺(tái)機(jī)器上,這需要用到網(wǎng)絡(luò)編程。

            第一個(gè)層次很好解決,幾十行代碼就搞定了。https://gist.github.com/4519962

            第二個(gè)層次不難解決,基本思路是分而治之,先hash分塊統(tǒng)計(jì)單詞出現(xiàn)次數(shù),將每一塊按出現(xiàn)次數(shù)排序,最后歸并。代碼見 https://github.com/chenshuo/recipes/blob/master/puzzle/query_freq.cc ,分析見 http://www.cnblogs.com/baiyanhuang/archive/2012/11/11/2764914.html

            第三個(gè)層次也不難,可以當(dāng)做網(wǎng)絡(luò)編程的練習(xí)來(lái)做。如果有合適的框架,可以輕松解決,因?yàn)閱卧~計(jì)數(shù)是map reduce的經(jīng)典范例,對(duì)出現(xiàn)次數(shù)排序也可以再用一步map reduce搞定(估計(jì)需要一個(gè)好的 shuffle 函數(shù),簡(jiǎn)單hash是不行的)。

            如果用普通網(wǎng)絡(luò)編程,一種設(shè)計(jì)思路如下圖,其中方框代表機(jī)器,橢圓代表輸入輸出文件,圓角矩形代表進(jìn)程。思路跟第二個(gè)層次一樣,先hash到多個(gè)shard文件(由hasher和receiver負(fù)責(zé)),再對(duì)每個(gè)shard文件排序(由sender負(fù)責(zé)),最后歸并(merger)。

            topk

            注意這種思路適合求top K元素,不適合按出現(xiàn)次數(shù)排序全部單詞,因?yàn)樽罱K結(jié)果收集在一臺(tái)機(jī)器上。目前這個(gè)sender實(shí)現(xiàn)的一個(gè)限制是,每個(gè)shard必須能全部放入內(nèi)存,因?yàn)閟ender對(duì)shard排序是在內(nèi)存中進(jìn)行的。如果數(shù)據(jù)更大,還需要實(shí)現(xiàn)單機(jī)外部排序。

            圖中hasher和receiver的代碼見muduo示例中的 muduo/examples/wordcount ;sender和merger的代碼見 https://github.com/chenshuo/recipes/tree/master/topk 。注意merger沒(méi)有使用muduo,而是采用阻塞網(wǎng)絡(luò)編程。有興趣的讀者可以思考其背后的原因。要想發(fā)揮 merger 正常的性能,需要修改 /usr/include/boost/asio/basic_socket_streambuf.hpp ,增大緩沖區(qū),即 enum { buffer_size = 8192 };

            這可以看作是map reduce的原始實(shí)現(xiàn),或者說(shuō)用map reduce的思想手寫了一些原始工具。如果把map reduce比作C語(yǔ)言,這里的幾個(gè)程序相當(dāng)于匯編寫的函數(shù)。

            以后我再寫一個(gè)按出現(xiàn)次數(shù)全排序的例子吧,需要替換這里的sender和merger。

            (.完.)

            posted on 2013-01-13 04:01 陳碩 閱讀(3603) 評(píng)論(2)  編輯 收藏 引用 所屬分類: muduo

            評(píng)論

            # re: muduo多機(jī)協(xié)作網(wǎng)絡(luò)編程示例一:?jiǎn)卧~計(jì)數(shù)及排序[未登錄](méi) 2013-01-14 10:58 春秋十二月

            不錯(cuò),看了代碼,雖沒(méi)直接實(shí)現(xiàn)Hash、堆和歸并算法,但這沒(méi)關(guān)系,使用現(xiàn)成的boost和stl庫(kù)也好,你對(duì)庫(kù)運(yùn)用的很到位  回復(fù)  更多評(píng)論   

            # re: muduo多機(jī)協(xié)作網(wǎng)絡(luò)編程示例一:?jiǎn)卧~計(jì)數(shù)及排序 2013-01-16 11:38 UCoding

            學(xué)習(xí)了!  回復(fù)  更多評(píng)論   

            <2011年4月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類

            隨筆檔案

            相冊(cè)

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产亚洲精午夜久久久久久| 伊人久久大香线蕉AV一区二区 | 狠狠色丁香婷婷综合久久来 | 久久精品女人天堂AV麻| 久久久久久噜噜精品免费直播| 2021最新久久久视精品爱| 欧美牲交A欧牲交aⅴ久久| 国产成人综合久久久久久| 久久人人爽人人爽人人片av麻烦| 亚洲精品乱码久久久久久蜜桃不卡| 久久精品人人做人人爽97| 久久免费大片| 老司机国内精品久久久久| 亚洲AV日韩精品久久久久久| 精品无码久久久久久久动漫| 久久精品国产99久久无毒不卡| 久久九九久精品国产免费直播| 久久超乳爆乳中文字幕| 2020久久精品亚洲热综合一本| 亚洲国产精品一区二区久久| 亚洲AV日韩精品久久久久久久| 久久久黄色大片| 欧美性猛交xxxx免费看久久久| 91久久精品电影| 国内精品九九久久久精品| 亚洲中文字幕无码久久2020| 一本久道久久综合狠狠躁AV| 久久久久这里只有精品| 国产精品无码久久久久| 曰曰摸天天摸人人看久久久| 777米奇久久最新地址| 精品久久久久久无码专区| 亚洲狠狠婷婷综合久久久久| 欧美国产成人久久精品| 久久亚洲精品无码aⅴ大香 | 久久午夜无码鲁丝片午夜精品| 国产99久久久国产精免费| 国产成人精品久久| 欧美国产成人久久精品| 久久精品国产99久久久古代| 亚洲成色www久久网站夜月|