大规模分布式系统架构与设计实战笔记8

用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");
}
}

附件是生成的一亿个整型随机数的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值