• <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多機協作網絡編程示例一:單詞計數及排序

            去年我寫了《Muduo 網絡編程示例》系列文章,這些文章已經收入《Linux 多線程服務端編程:使用 muduo C++ 網絡庫》一書。這些文章講的基本都是運行在單機上的網絡程序,每個例子都只有一個程序(第7.13節例外)。我接下來打算繼續寫幾篇文章,談一談分布在多臺機器上、協作發揮作用的網絡編程例子。

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

            這個問題有三個層次,第一是輸入文件比較小,能完全放入內存;第二是輸入文件比較大,不能一次性都放入內存;第三是輸入文件分布在多臺機器上,這需要用到網絡編程。

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

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

            第三個層次也不難,可以當做網絡編程的練習來做。如果有合適的框架,可以輕松解決,因為單詞計數是map reduce的經典范例,對出現次數排序也可以再用一步map reduce搞定(估計需要一個好的 shuffle 函數,簡單hash是不行的)。

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

            topk

            注意這種思路適合求top K元素,不適合按出現次數排序全部單詞,因為最終結果收集在一臺機器上。目前這個sender實現的一個限制是,每個shard必須能全部放入內存,因為sender對shard排序是在內存中進行的。如果數據更大,還需要實現單機外部排序。

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

            這可以看作是map reduce的原始實現,或者說用map reduce的思想手寫了一些原始工具。如果把map reduce比作C語言,這里的幾個程序相當于匯編寫的函數。

            以后我再寫一個按出現次數全排序的例子吧,需要替換這里的sender和merger。

            (.完.)

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

            評論

            # re: muduo多機協作網絡編程示例一:單詞計數及排序[未登錄] 2013-01-14 10:58 春秋十二月

            不錯,看了代碼,雖沒直接實現Hash、堆和歸并算法,但這沒關系,使用現成的boost和stl庫也好,你對庫運用的很到位  回復  更多評論   

            # re: muduo多機協作網絡編程示例一:單詞計數及排序 2013-01-16 11:38 UCoding

            學習了!  回復  更多評論   

            <2013年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統計

            常用鏈接

            隨筆分類

            隨筆檔案

            相冊

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            中文字幕无码精品亚洲资源网久久| 亚洲日本va午夜中文字幕久久| 奇米综合四色77777久久| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 国产精品日韩欧美久久综合| 久久精品国产精品亚洲下载| 久久精品国产亚洲AV蜜臀色欲| 久久久一本精品99久久精品66| 狠狠色婷婷综合天天久久丁香| 亚洲国产成人精品91久久久| 久久偷看各类wc女厕嘘嘘| 国产精品日韩深夜福利久久| 久久亚洲精品成人av无码网站| 无码乱码观看精品久久| 精品综合久久久久久888蜜芽| 午夜精品久久久久9999高清| 国内精品久久久人妻中文字幕| 合区精品久久久中文字幕一区| 亚洲国产精品久久久久婷婷软件 | 久久免费视频一区| 日本精品久久久中文字幕| 亚洲午夜久久久久久久久电影网 | 亚洲国产成人久久精品动漫| 久久精品国产亚洲av麻豆图片| 午夜精品久久久久久影视777| 99久久国产综合精品五月天喷水| 久久精品无码午夜福利理论片 | 欧美一区二区三区久久综合| 午夜精品久久影院蜜桃| 日日狠狠久久偷偷色综合96蜜桃| A级毛片无码久久精品免费| 老色鬼久久亚洲AV综合| 日韩AV无码久久一区二区 | 国内精品免费久久影院| 爱做久久久久久| 91亚洲国产成人久久精品| 国产精品伊人久久伊人电影| 国产一区二区久久久| 热久久这里只有精品| 国内精品伊人久久久久av一坑| 国内精品久久九九国产精品|