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。

(.完.)



    本文转自 陈硕  博客园博客,原文链接:http://www.cnblogs.com/Solstice/archive/2013/01/13/2858173.html,如需转载请自行联系原作者




相关文章
|
6月前
|
网络协议 网络虚拟化 数据中心
华为配置VXLAN构建虚拟网络实现相同网段互通示例(静态方式)
配置VXLAN构建虚拟网络实现相同网段互通示例(静态方式
200 0
|
3月前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
61 0
|
3月前
|
运维 网络架构 Python
利用Python查询H3C网络设备示例,运维用了它,都称赞!
利用Python查询H3C网络设备示例,运维用了它,都称赞!
|
3月前
|
机器学习/深度学习 自然语言处理 TensorFlow
|
5月前
|
Java C++ 开发者
muduo网络库
【6月更文挑战第15天】
77 7
|
4月前
|
网络协议 安全 Python
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
|
6月前
|
机器学习/深度学习 JSON PyTorch
图神经网络入门示例:使用PyTorch Geometric 进行节点分类
本文介绍了如何使用PyTorch处理同构图数据进行节点分类。首先,数据集来自Facebook Large Page-Page Network,包含22,470个页面,分为四类,具有不同大小的特征向量。为训练神经网络,需创建PyTorch Data对象,涉及读取CSV和JSON文件,处理不一致的特征向量大小并进行归一化。接着,加载边数据以构建图。通过`Data`对象创建同构图,之后数据被分为70%训练集和30%测试集。训练了两种模型:MLP和GCN。GCN在测试集上实现了80%的准确率,优于MLP的46%,展示了利用图信息的优势。
95 1
|
4月前
|
数据采集 Perl
错误处理在网络爬虫开发中的重要性:Perl示例 引言
错误处理在网络爬虫开发中的重要性:Perl示例 引言
|
6月前
|
数据采集 存储 iOS开发
Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例
本文介绍了如何使用Objective-C的MWFeedParser库高效捕获Stack Overflow的RSS数据并保存为CSV。首先,通过CocoaPods或手动方式集成MWFeedParser库,然后设置代理服务器以隐藏真实IP。接着,创建MWFeedParser实例,设置代理和解析类型,并启动解析。当数据解析完成后,可将其转换为CSV格式并保存。提供的代码示例详细展示了整个过程。注意实际使用时需替换代理服务器的相关信息。
Objective-C网络数据捕获:使用MWFeedParser库下载Stack Overflow示例
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
NNLM - 神经网络语言模型 | 高效的单词预测工具
NNLM - 神经网络语言模型 | 高效的单词预测工具
111 1
下一篇
无影云桌面