实在无聊玩割数据

      看软设的教程太枯燥了,实在无聊,干点什么,就来写点基础的Java代码运行运行吧。上次看到有面试题是处理大数据查询的,我就来试试切割大文件吧。

      自己生成一个数据文件,来个2G大小的txt,里面装满字符“a”:

                StringBuffer sb = new StringBuffer();
		BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(
				"performace.txt"));
		System.out.println("Begin...");
		long start = System.currentTimeMillis();
		for (int i = 0; i < 2048; ++i) {
			for (int j = 0; j < 1024; ++j) {
				for (int k = 0; k < 1024; ++k) {
					sb.append("a");
				}
				sb.append("\n");
			}
			bufferedWriter.write(sb.toString()); 
			sb = sb.delete(0, sb.length());
		}
		bufferedWriter.flush();
		bufferedWriter.close();
		long end = System.currentTimeMillis();
		System.out.println((end - start) + "ms elapsed.");

        接下来就割吧。割成单个的文件应该定为多大呢?我用字节buffer获取数据,试下来12MB可以,13MB就堆溢出了:

int bufSize = 1024*1024;
		StringBuffer sb=new StringBuffer();
	    byte[] bs = new byte[bufSize];
	    ByteBuffer byteBuf = ByteBuffer.allocate(bufSize);
	    System.out.println("Begin...");
	    long start = System.currentTimeMillis();
	    FileChannel channel = new RandomAccessFile("performace.txt","r").getChannel();
	    long size,count=1;
	    while((size = channel.read(byteBuf)) != -1) {
	      byteBuf.rewind();
	      byteBuf.get(bs);
	      sb.append(new String (bs));
	      if(count%(12)==0){
	    	  System.out.println(count);
	    	  BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(
	  				"文件"+(count/(12))+".txt"));
	    	  bufferedWriter.write(sb.toString());
	    	  sb=sb.delete(0, sb.length());
	    	  bufferedWriter.flush();
	    	  bufferedWriter.close();
	      }
	      byteBuf.clear();
	      count++;
	    }
	    channel.close();
	    long end = System.currentTimeMillis();
	    System.out.println((end - start) + "ms elapsed.");

       但如果直接用BufferedReader读,同样用StringBuffer缓存数据,却可以割成13MB大小的文件,14MB溢出了:

int bufSize = 1024*1024;
		StringBuffer sb=new StringBuffer();
	    byte[] bs = new byte[bufSize];
	    ByteBuffer byteBuf = ByteBuffer.allocate(bufSize);
	    System.out.println("Begin...");
	    long start = System.currentTimeMillis();
	    FileChannel channel = new RandomAccessFile("performace.txt","r").getChannel();
	    long size,count=1;
	    while((size = channel.read(byteBuf)) != -1) {
	      byteBuf.rewind();
	      byteBuf.get(bs);
	      sb.append(new String (bs));
	      if(count%(12)==0){
	    	  System.out.println(count);
	    	  BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(
	  				"文件"+(count/(12))+".txt"));
	    	  bufferedWriter.write(sb.toString());
	    	  sb=sb.delete(0, sb.length());
	    	  bufferedWriter.flush();
	    	  bufferedWriter.close();
	      }
	      byteBuf.clear();
	      count++;
	    }
	    channel.close();
	    long end = System.currentTimeMillis();
	    System.out.println((end - start) + "ms elapsed.");
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值