Java 高效读取大数据文件—最优方法

数据背景,一个文件大小>=10G,每一行都是一个json对象数据 如下:

{"id":"C0D962","time":"2015-09-01 23:59:54","lon":"113.534","lat":"22.214",……}


高效读取的方法:

方法一:

      readLine()占用总时间的80%,使用BufferedReader,每次读入5M数据.减少IO.如:

BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);

业界评价:IO本身就是瓶颈,提高IO数据吞吐量的办法,使用BufferedReader已经是一个很好的选择了。
速度最快的方法,当然是MappedByteBuffer,但是,相比BufferedReader而言,效果不是非常明显。
也就是说,后者虽然快,但是,也快的有限。楼主不要抱着新能提升几倍的幻想了。

目前,楼主的需求而看,采用MappedByteBuffer读取数据,是最佳选择。

要是不用多线程(多线程提升潜力也不大),那么,换磁盘阵列 是个不错的选择。
你要是还不明白是怎么回事,那就把磁盘型号抄下来,去网上搜一搜,磁盘的读写速度就知道了。

详解:

当逐行读写大于2G的文本文件时推荐使用以下代码
void largeFileIO(String inputFile, String outputFile) {
        try {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File(inputFile)));
            BufferedReader in = new BufferedReader(new InputStreamReader(bis, "utf-8"), 10 * 1024 * 1024);//10M缓存
            FileWriter fw = new FileWriter(outputFile);
            while (in.ready()) {
                String line = in.readLine();
                fw.append(line + " ");
            }
            in.close();
            fw.flush();
            fw.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

jdk本身就支持超大文件的读写。
网上的文章基本分为两大类,一类是使用BufferedReader类读写超大文件;另一类是使用RandomAccessFile类读取,经过比较,最后使用了前一种方式进行超大文件的读取,下面是相关代码,其实很简单
-------------------------------------------------------------------

File file = new File(filepath);   
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));    
BufferedReader reader = new BufferedReader(new InputStreamReader(fis,"utf-8"),5*1024*1024);// 用5M的缓冲读取文本文件  
  
String line = "";
while((line = reader.readLine()) != null){
//TODO: write your business
}
---------------------------------------------------------------------
注意代码,在实例化BufferedReader时,增加一个分配缓存的参数即可




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangyong58

喝杯茶还能肝到天亮,共同进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值