一个没有完成的多线程题目

  好像已经好几周没有写什么了。在双十一之前的项目暂时告一段落,也就有时间补补基础。

目前手头的是个很有意思的题目:数据源:全国所有城市从1960年至2012年的每天的最高气温和最低气温。文件总共有10G左右,全部为txt文件,每个文件里面仅仅是max:1 min:-4 这样的一行文字,求所有文件里面差值最大为多少。

       数据格式很简单,就是简单的字符串,而且每个文件只有一个 max 和一个min。很明显,这道题目的瓶颈在于文件IO操作,而不在于数值计算。那如何能最大限度的减少IO操作所花费的时间成本呢?那么本鸟菜想到的解决方案就是:分布式+多线程。

       想和做完全是两回事。在写多线程之前,先写了一个单线程的。结果一跑就是1个小时鄙视。不过这个好处就是找到了答案,从而使得多线程的运行有个参照。先把代码贴一下,

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;

public class Weather {

    private static int peak;// final result
    
    private String dirName;
    
    private String rsFileName;
	
    public void getPeakFromFile(String inputFile, String outputFile) throws Exception{

    	   File infile = new File(inputFile);
   		   File rsFile = new File(outputFile);
   		   BufferedReader reader = null;
   		   BufferedWriter writer = new BufferedWriter(new FileWriter(rsFile));

	   		String temp = null;
   			if(infile.isDirectory()){
   			    File[]	fls = infile.listFiles(); 
   				for(File f : fls){ //each citys 
   					File[] childrenFile = f.listFiles();
   					for(File cf :childrenFile ){//each year  txt
   						try {
   							reader = new BufferedReader(new FileReader(cf));
   							reader.skip(4);
   							while(( temp = reader.readLine())!=null){
   							    int	max = Integer.valueOf(temp.substring(0, temp.indexOf(" ")));
   							    int min = Integer.valueOf(temp.substring(temp.indexOf(":")+1));
   							    if((max-min) > peak){
   							    	peak = max -min;
   							    	rsFileName = cf.getName();
   							    	dirName = f.getName();
   							    }
   							}
   							reader.close();
   							} catch (FileNotFoundException e) {
   							}
   						}
   					}
	   			}
	   			writer.write(" dir:"+dirName + "fileName:"+rsFileName + "peak:"+peak);
	   			writer.close();
	   }
 
    
    
	 public static void main(String[] args) throws Exception {
		 try {
			 String inputFilename  ="E:/weather";
			 String outputFilename ="E:/rs.txt";
			 
			 Weather weather = new Weather();
			 weather.getPeakFromFile(inputFilename,outputFilename);
			 
		} catch (Exception e) {
		}
		}
}

这段代码跑了一个小时,得出的结论是最大差值为 9。多线程的改日再贴出来。稍后。

     




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值