c++分布式计算类库

分布式计算被誉为高端的东东,我想也是每个程序员都想涉足的领域了。

前一段时间项目中遇到了大数据计算的问题,一般计算时间都要2~3小时,甚至一整天的。我想能不能利用多台机器分布式计算,减少计算时间呢?当前分布式计算框架主要有hadoop, google的map/reduce,或一些其它的框架。但这些东东实在太庞大了,也需要我们修改已有的程序代码。

于是想到了zeromq这个家伙,引用官方的说法: “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一 层封装。ZMQ让编写高性能网络应用程序极为简单和有趣。”。

事实证明,zeromq用起来果然不错。

我的做法是:

1、使用zeromq作为通信底层。使用c++对象作为网络传输的基本单位,并使用c++对象反射机制实现对象的解析。

2、每一个任务,即是一个对象。任务的分解(map)与归约(reduce)的任务,则分配给了使用者本身,因为只有TA知道任务的具体算法与数据。一个任务包含了数据、算法、结果(待计算)。

3、任务分解之后,只需要简单调用DoMultiTask(taskList, waitTime)即可。剩下的工作就是等待计算完成,然后归约。

4、类库接收到任务后,将其发送到主服务器,主服务器使用负载均衡算法/最近最少使用算法,将任务发放给已经注册的工作机(worker)。工作机处理完成后返还给主机,主机返还给客户,将结果写入任务(task)的结果变量中。

5、所有计算完成返回,有客户端归约。

其中,分布式框架做的事情就是工作机的注册与管理、服务器(路由)的管理,客户端任务的发送与结果接收,类型反射等。

这样做的优点是,不需要修改已有程序代码,只需增加任务类即可。

当人们使用同一个软件工作,TA愿意选择作为分布式计算客户端,则会向服务器注册这个机器然后被使用,程序就会运行一个线程等待任务。

ps:未来有一个问题需要解决:现在假定的是客户端与工作机的类库相同,即对象能够成功反射。如果一个任务(对象)传送到工作机,可是工作机没有这个对象的反射信息,最多只能反射数据,不能动态生成任务的算法。总不能传一段c++代码,让客户机解释执行吧?我想到的解决方法有:如果反射失败,那么要求客户端将类库信息(dll)发送到工作机,工作机加载类库,然后进行类型反射。

源代码:https://github.com/dario-DI/DistributedCompute

时间: 2024-11-08 11:11:54

c++分布式计算类库的相关文章

Java千百问_08JDK详解(005)_jdk服务集成类库都有什么

点击进入_更多_Java千百问 1.jdk服务集成类库都有什么 了解java核心框架看这里:java核心框架是什么样的 1. 数据库链接工具(Java Database Connectivity,JDBC) JDBC API提供了使用java访问数据库的通用接口,使用JDBC 3.0或以上,开发人员编写的应用程序可以访问几乎任何数据源,从关系数据库到电子表格甚至文本文件,JDBC技术还提供了很多通用的基础工具和备用接口. 了解JDBC看这里:[JDBC是什么][3] 远程方法调用(Remote

Guava:好用的java类库 学习小记

基础功能 google guava中定义的String操作 在google guava中为字符串操作提供了很大的便利,有老牌的判断字符串是否为空字符串或者为null,用指定字符填充字符串,以及拆分合并字符串,字符串匹配的判断等等. 1. 使用com.google.common.base.Strings类的isNullOrEmpty(input)方法判断字符串是否为空 1 //Strings.isNullOrEmpty(input) demo 2 String input = ""; 3

类库,委托,is和as运算符,泛型集合

类库:其实就是一堆类文件,只不过用户看不到这些类的源代码,保密性好. 优点:保密性好缺点:如果这个方法不好用,使用者无法自己去更改它. 类文件是.cs    类库是.dll 新建项目为类库,在debug文件夹下找到dll文件 委托:委托可以理解为:函数的指针 关键词:delegate 声明委托类型:public delegate int FirstDel(int a, int b); FirstDel不是类,是委托变量,不能实例化(不能new), 创建委托变量:FirstDel 名字 = 与这个

Python 类库

Http 类库 Requests: HTTP for Humans >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) >>> r.status_code200 >>> r.headers['content-type'] 'application/json; charset=utf8' >>> r.encoding'utf-8' >

android studio中导入第三方类库

http://zhidao.baidu.com/link?url=W0zaTJAdd4qiJ2PwIGK39bqjQ3-a8CxA-EZb1M9FQZGnPHMfxPzn0h1AoPED-ix7GiSgfDV0EGKtl_9TJXyqaje0BTCTuZ2VOLI8PSoI4nq 下面分两种情况介绍一下如何导入第三方类库. 1.对于jar的类库,非常简单,只要在项目根目录下新建一个libs目录,然后把jar复制进去,在jar上点击右键,选择Add as library,即可完成依赖的添加. 2.

JAVA平台开放图表绘制类库——JFreeChart

好的东西要分享要推荐,这里向大家推荐一个java平台下的一个开源图表绘制类库JFreeChart,相关资源(源代码.demo源码.开发指南)已经上传至CSDN资源,需要的可以自行下载. JFreeChart的图表绘制功能非常强大,涵盖了几乎所有想的到的图表,并且绘制效果还很炫酷.来看下JFreeChart的主要效果图: 之前都是用excel绘制的图表,还要调整很多属性之类的东西,觉得很麻烦,所以就全部模块化实现了,代码就不贴出来了. JFreeChart相关资源下载地址:http://downl

word相关转换类库

using System;using System.Collections.Generic;using System.Text;using Microsoft.Office.Interop.Word;using System.IO;using System.Web;using System.Data;using System.Reflection;using Microsoft.Win32;using System.Text.RegularExpressions;using System.Net

前端框架与前端类库的理解

前端框架的理解误区 网站的价值在于它能为用户提供什么价值,在于网站能做什么,而不在于它是怎么做的,所以在网站还很小的时候就去追求网站的架构框架是舍本逐末,得不偿失的.前端框架同理,如果是一个简单的页面型产品,应用只是依赖服务器来生成Web页面和视图,并且只需要使用一些简单的Javascript或者JQuery来使应用更加具有互动性,那么一个JQuery前端类库就可以了,真的没必要用上一些高大上的框架. 当然,框架的确是很有用的,重点是我们要知道什么时候该用什么框架.大公司大项目的经验和成功模式固

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包