用fourinone实现的基于整型读写的上亿排序
import com.fourinone.BeanContext;
public class ParkServerDemo
{
public static void main(String[] args)
{
BeanContext.startPark();
}
}
import com.fourinone.*;
import java.util.*;
import com.fourinone.ArrayAdapter.*;
//public class Worker extends MigrantWorker
public class Worker extends MigrantWorker
{
int total=25000000;//总共的数据数
int max=100000;//最大数据
int block=100000;//每次处理多少数据
int groups=16;//一共将数据分成多少组
int groupnum=max/groups;//每组多少数据
String path="d://tmp";//文件位置
Workman[] wms=null;
public Worker(){}
public Worker(int total,int max,int block,int groups,String path)
{
this.total=total;
this.max=max;
this.block=block;
this.groups=groups;
this.groupnum=max/groups;
this.path=path;
}
public WareHouse doTask(WareHouse wh)
{
int index=getSelfIndex();
int step=(Integer)wh.getObj("step");
if(wms==null)
{
wms=getWorkerAll();
}
WareHouse result=new WareHouse("ok",1);
//long begin=(new Date()).getTime();
if(step==1)
{
//生成16个文件
FileAdapter[] fas=new FileAdapter[groups];
for(int i=0;i<groups;i++)
fas[i]=new FileAdapter(path+"//"+index+"//"+i+"//data");
//要处理的文件
FileAdapter fa=new FileAdapter(path+"//"+index+"//data");
for(int n=0;n<(total/block);n++)
{
//每次处理1000个数据
int [] its=fa.getIntReader(n*block,block).readIntAll();
//开辟一个ArrayList数组
ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>> ();
for(int p=0;p<groups;p++)
{
list.add(new ArrayList<Integer>());
}
int temp=-1;
for(int m=0;m<block;m++)
{
temp=its[m]/groupnum;
//System.out.println(temp);
list.get(temp).add(its[m]);
}
for(int k=0;k<groups;k++)
{
fas[k].getIntWriter().writeListInt(list.get(k));
}
}
}
else if(step==2)
{
for(int i=0;i<16;i++)
{
FileAdapter fa=new FileAdapter(path+"//"+index+"//"+i+"//data");
int[] nums=fa.getIntReader().readIntAll();
if((i/4)!=index)
{
WareHouse out=new WareHouse();
out.put("i",i);
out.put("v",nums);
//将文件挪到(i/4)号节点的i文件中去
wms[i/4].receive(out);
}
fa.close();
}
}
else if(step==3)
{
int total=0;
for(int i=0;i<16;i++)
{
if((i/4)==index)
{
FileAdapter fa=new FileAdapter(path+"//"+index+"//"+i+"//data");
int [] nums=fa.getIntReader().readIntAll();
ListInt is=ArrayAdapter.getListInt();
is.sort(nums);
total+=nums.length;
FileAdapter tofa=new FileAdapter(path+"//"+index+"//"+i+".data");
tofa.getIntWriter().writeInt(nums);
System.out.println("写数据到"+i+".data");
fa.close();
}
else
{
FileAdapter fa=new FileAdapter(path+"//"+index+"//"+i);
fa.delete();
fa.close();
}
}
result.setObj("total",total);
}
return result;
}
protected boolean receive(WareHouse inhouse)
{
Integer i=(Integer)inhouse.get("i");
int [] nums=(int [])inhouse.get("v");
int index=i/4;
FileAdapter fa=new FileAdapter(path+"//"+index+"//"+i+"//data");
fa.getIntWriter().writeInt(nums);
System.out.println("文件"+i+"放到"+index+"节点上");
return true;
}
public static void main(String [] args)
{
Worker w=new Worker(Integer.parseInt(args[2]),Integer.parseInt(args[3]),Integer.parseInt(args[4]),Integer.parseInt(args[5]),args[6]);
w.waitWorking(args[0],Integer.parseInt(args[1]),"Worker");
}
}
import com.fourinone.Contractor;
import com.fourinone.WareHouse;
import com.fourinone.WorkerLocal;
import java.util.Date;
public class Ctor extends Contractor
{
public WareHouse giveTask(WareHouse wh)
{
WorkerLocal[] wks = getWaitingWorkers("Worker");
System.out.println("wks.length:"+wks.length+";"+wh);
int total=0;
System.out.println("第一步");
wh.setObj("step", 1);//1:group;
doTaskBatch(wks, wh);
System.out.println("第二步");
wh.setObj("step", 2);//2:merge;
doTaskBatch(wks, wh);
System.out.println("第三步");
wh.setObj("step", 3);//3:sort
WareHouse[] hmarr = doTaskBatch(wks, wh);
for(int i=0;i<hmarr.length;i++){
Object num = hmarr[i].getObj("total");
if(num!=null)
total+=(Integer)num;
}
wh.setObj("total",total);
return wh;
}
public static void main(String[] args)
{
Ctor a = new Ctor();
WareHouse wh = new WareHouse();
long begin = (new Date()).getTime();
a.doProject(wh);
long end = (new Date()).getTime();
System.out.println("total:"+wh.getObj("total")+",time:"+(end-begin)/1000+"s");
}
}
附件是生成的一亿个整型随机数的代码
分享到:
相关推荐
文档内容有关于MySQL的主从配置,MySQL读写分离、MySQL集群配置、Redis主从配置、Redis集群配置、kafka单机与集群搭建以及使用、zookeeper单机与集群搭建以及使用、部分夹杂着其他乱七八糟的笔记内容。
文是学习大型分布式网站架构的技术总结。对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进行了概要性描述,并给出一个架构参考。一部分为读书笔记,一部分是个人经验总结。对大型分布式网站架构有很好的参考...
大型分布式网站架构设计与实践+笔记.zip 1.Cache缓存 2.持久化存储 3.消息系统MQ 4.垂直化搜索引擎 5.其他基础设施
分布式系统原理与范例读书笔记
2019年软考系统架构设计师学习笔记.pdf2019年软考系统架构设计师学习笔记.pdf2019年软考系统架构设计师学习笔记.pdf2019年软考系统架构设计师学习笔记.pdf2019年软考系统架构设计师学习笔记.pdf2019年软考系统架构...
Java架构开发大型互联网-架构师必须掌握的分布式技术pdf+视频
第二部分给出了一些实际的分布式系统:基于对象的分布式系统、分布式文件系统、基于文档的分布式系统以及基于协作的分布式系统,介绍了一些实际系统的设计思想和实现技术。全书结构清晰,内容全面经典,系统性与先进...
本人在看《大规模分布式存储系统》这本书的过程中,记录的思维导图笔记,方便学习和复习这本书的重点内容,适合于分布式存储的入门同学。书中实战的部分因为是基于阿里的ocean base,比较具体,处于入门学习的目的,...
分布式系统原理与范式 第二版 2008年版本 与原教材无缝吻合,极好的辅助学习资料
系统架构设计师属于高级工程师的范畴,本学习笔记内容系统全面,要考系统架构设计师的可以参考学习,有帮助的可以来下载学习。
系统架构设计师复习笔记,复习精华,值得参考。。。。。。。。。。。。
软考高级系统架构师经验复习笔记仅供个人学习使用
原来的PDF版有85M,过大。这个是epud版,只有6M,方便阅读和摘抄笔记。
软考系统架构设计师(高级)学习笔记汇总 系统架构设计师考试大纲 系统架构设计师考试大纲和复习指南 系统架构设计师课程大纲 系统架构设计师:浅谈架构 系统架构设计师:软件架构师之路 系统架构设计师复习笔记 系统...
第一章 概述传统存储系统的纵向扩展,即先买小型机,不够再中型机,再不然就大型机,即增加单机的容量。分布式存储系统分为分布式文件系统,分布式键值系统,分布式表格系
系统架构师学习笔记,很好的架构师学习资料,十分详细。
耗时半年研发的生产级项目大课,学完对标一线城市30K以上月薪
分布式锁笔记笔记笔记笔记
系统架构师复习笔记.docx