码迷,mamicode.com
首页 > 其他好文 > 详细

快速读取大文件的几种方式

时间:2017-09-29 14:58:36      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:file   auto   时间   art   buffer   case   lock   col   gen   

转一篇:http://blog.csdn.net/fengxingzhe001/article/details/67640083

原来使用一行一行读取文本的方式,速度是慢的的可以,弄了好久还是不行,后来看了下才知道要用字节流传输会快很多

我自己也测了一下80M的文件,发现给读入块的大小会很明显的影响读入的速度。

测试代码如下:

def useBufferIStream(): Util = {
    try {
      val begin = System.currentTimeMillis
      val file = new File(s"E:\\data\\part-m-00000")
      val fis = new FileInputStream(file)
      val bis = new BufferedInputStream(fis)
      val buffer = new Array[Byte](1024*1024*90)
      var content = ""
      var cnt = 0
      cnt = bis.read(buffer)
      while( cnt != -1) {
        content += new String(buffer, 0, cnt)
        cnt=bis.read(buffer)
      }

      bis.close()
      println("=====BufferIStream===== time: " + (System.currentTimeMillis - begin) + "ms")

    } catch {
      case e: Exception =>
        // TODO Auto-generated catch block
        e.printStackTrace()
        println("error")
    }

  }

  代码中绿色部分为读入块的大小,目前设定的是90M大于要读的数据,这时的读入时间只要0.2s

  如果改为10M即(1024*1024*10),读入时间就需要10s左右,速度有很明显的变化。

  这里解释一下一部分代码:

  1、val buffer = new Array[Byte](1024*1024*90)  为每次读入文件的大小;

  2、cnt = bis.read(buffer) 读入数据块大小的标识,如果读入块没用信息则为-1,有信息则为这块信息的大小;

  3、content 为最终读入的文本信息

  4、这里使用的Scala语言,测试中发现

    cnt = bis.read(buffer)
      while( cnt != -1) {
        content += new String(buffer, 0, cnt)
        cnt=bis.read(buffer)
      }

  while的这块语句书写必须用这种形式,不能使用  while((cnt=fis.read(buffer)) != -1)  ,虽然在java上运行是都可以的,但是在Scala中,后者运行会报错,具体原因不明,应该跟Scala的一些机制有关

 

快速读取大文件的几种方式

标签:file   auto   时间   art   buffer   case   lock   col   gen   

原文地址:http://www.cnblogs.com/LazyJoJo/p/7610791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!