机器学习和生物信息学实验室联盟

标题: 关于快速确定大文件的行数 [打印本页]

作者: xmubingo    时间: 2012-3-29 16:00
标题: 关于快速确定大文件的行数
本帖最后由 xmubingo 于 2012-3-29 16:02 编辑

一般我们确定行数方法是读一行行:
  1. public static void main(String args[])throws Exception
  2.         {
  3.                 Long startTime = System.currentTimeMillis();
  4.                 BufferedReader br = new BufferedReader(new FileReader("F:\\hs37p1.EID\\hs37.intrEID"));
  5.                 double i=0;
  6.                 while(br.readLine()!=null)
  7.                 {
  8.                         i++;
  9.                 }
  10.                 br.close();
  11.                 System.out.println(String.valueOf(i));
  12.                 Long endTime = System.currentTimeMillis();
  13.                 System.out.println("Totle time is "+ (endTime - startTime) + " milliseconds");
  14.         }
复制代码
网上说有种方法很快:
  1. static public void main(String args[]) {
  2.                 Long startTime = System.currentTimeMillis();
  3.                 File test = new File("F:\\hs37p1.EID\\hs37.intrEID");
  4.                 long fileLength = test.length();

  5.                 LineNumberReader rf = null;
  6.                 try {
  7.                         rf = new LineNumberReader(new FileReader(test));
  8.                         if (rf != null) {
  9.                                 double lines = 0;
  10.                                 rf.skip(fileLength);
  11.                                 lines = rf.getLineNumber();
  12.                                 rf.close();
  13.                                 System.out.println(String.valueOf(lines));
  14.                         }
  15.                        
  16.                 } catch (IOException e) {
  17.                         if (rf != null) {
  18.                                 try {
  19.                                         rf.close();
  20.                                 } catch (IOException ee) {
  21.                                 }
  22.                         }
  23.                 }
  24.                 Long endTime = System.currentTimeMillis();
  25.                 System.out.println("Totle time is "+ (endTime - startTime) + " milliseconds");
  26.         }
复制代码
对一个1.72GB的文件,确定他们的行数871812行。
第一种方法:19466 milliseconds
第二种方法:18732 milliseconds

没觉得快多少。。。。。。。。
18秒对于webserver来说太可怕 了。
有没有更快的方法?求教育
作者: zouquan    时间: 2012-3-29 16:07
第二种方法很有意思,感觉更专业。web server毕竟不去用处理1.7G的文件。

但我猜底层实现是一样的,所以两种方法速度差不多。

如果第一种改成
String s=br.readLine();
i++;

估计就会慢不少
作者: xmubingo    时间: 2012-3-29 21:41
zouquan 发表于 2012-3-29 16:07
第二种方法很有意思,感觉更专业。web server毕竟不去用处理1.7G的文件。

但我猜底层实现是一样的,所以 ...

嗯,我决定采用第二种方法。




欢迎光临 机器学习和生物信息学实验室联盟 (http://123.57.240.48/) Powered by Discuz! X3.2