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时,增加一个分配缓存的参数即可




你可能感兴趣的:(java)