好像已经好几周没有写什么了。在双十一之前的项目暂时告一段落,也就有时间补补基础。
目前手头的是个很有意思的题目:数据源:全国所有城市从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。多线程的改日再贴出来。稍后。