思考:如果不考虑多线程,分布式的话,要高效的毒如和写出大文件,主要是解决:1.读文件和写文件的磁盘IO问题,通过批量读取和批量写出来实现。2.stringbuffer,和算法问题
/*
* 1.该方法实现了批量输入,批量输出。
* 输入文件大小:15G(31036260行),输出文件大小:4.1G(31036260行),insize=200M,outPerCount=10000
* --begin:2017-06-16 11:26:46--
* --end:2017-06-16 11:49:41--
* 总耗时:22min55sec
*
* 1.该方法实现了批量输入,批量输出。
* 2.新增了stringbuffer。
* 输入文件大小:15G(31036260行),输出文件大小:4.1G(31036260行),insize=200M,outPerCount=10000
* --begin:2017-06-16 18:30:33--
* --end:2017-06-16 18:39:58--
* 总耗时:9min25sec
*
* 1.该方法实现了批量输入,批量输出。
* 2.新增了stringbuffer。
* 输入文件大小:15G(31036260行),输出文件大小:4.1G(31036260行),insize=200M,outPerCount=100000
* --begin:2017-06-16 18:53:47--
* --end:2017-06-16 19:03:28--
* 总耗时:9min41sec
*
* 1.该方法实现了批量输入,批量输出。
* 2.新增了stringbuffer。
* 输入文件大小:15G(31036260行),输出文件大小:4.1G(31036260行),insize=400M,outPerCount=10000
* --begin:2017-06-16 20:56:26--
* --end:2017-06-16 21:05:33--
* 总耗时:9min07sec
*
*/
private void jsonToTxtBigFileHIHO1(String[] args) {
// ssh postgres@132.121.91.236
// Ab123456
// 数据在/data1/hisdata_data
// 是东莞的数据,具体是什么业务的不清楚
// java -jar test.jar /data1/hisdata_data/tmp/hisdata_hisdata_ow_pay_dg_balance_source /data1/hisdata_data/tmp/hisdata_hisdata_ow_pay_dg_balance_source.txt
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println("--begin:"+df.format(new Date())+"--");
String inPath = null;
String outPath = null;
if(args.length==2){
inPath = args[0];
outPath = args[1];
}else{
inPath = "D://test/data1.json";
outPath = "D://test/data1-new.txt";
}
StringBuffer outRow = new StringBuffer();
StringBuffer outBlock = new StringBuffer();//存储数据块的数据
int i = 0;
// int j = 0;
int perCount = 10000;//每一万行磁盘IO写一次
int preSize = 400 * 1024 * 1024;//读入的数据块大小
JsonParser parser = new JsonParser(); // 创建JSON解析器
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(new File(inPath)));
BufferedReader in = new BufferedReader(new InputStreamReader(bis,
"utf-8"), preSize);// 10M缓存
FileWriter fw = new FileWriter(outPath);
while (in.ready()) {
//****
//开始批量读入数据
//****
outRow = new StringBuffer();
String line = in.readLine();
i=i+1;
JsonObject object = (JsonObject) parser.parse(line);
Iterator iterator = object.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, JsonElement> entry = (Entry<String, JsonElement>) iterator
.next();
if (outRow.length()>0){
outRow.append("|");
}
outRow.append(entry.getValue());
// outRow.re = outRow.replace("\"", "");
}
if (outBlock.length()>0){
outBlock.append("\n");
}
outBlock.append(outRow);
//****
//开始批量写出数据
//****
if(i>=perCount){
fw.append(outBlock.toString().replaceAll("\"", "") + "\n");
outBlock = new StringBuffer();
i=0;
}
}
//****
//最后一次批量写出数据
//****
if(outBlock.length()>0){
fw.append(outBlock.toString().replaceAll("\"", "") + "\n");
outBlock = new StringBuffer();
i = 0;
}
in.close();
fw.flush();
fw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println("--end:"+df.format(new Date())+"--");
}