java 单线程读取大文件10G

思考:如果不考虑多线程,分布式的话,要高效的毒如和写出大文件,主要是解决: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())+"--");

	}








  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值