小弟现在做一个文件分析程序,目标是把300多每个2G的文件进行按行数据筛选,请问高手大约需要多长时间能读完?怎样能提高读取的速度? 
我处理完发现需要一周左右能筛选完成,速度很致命,小弟黔驴技穷,请大家指点如何能提高目前这种需求下的效率?严重感谢大家!

解决方案 »

  1.   

    多线程是种思路,可是需要轮番等待cpu时间,线程多了和单线程执行的效率是差不多的
      

  2.   

    多线程也需要等待cpu时间啊,这和单线程时间上会有很大区别吗?
      

  3.   

    NIO,这么大的io操作,你可以看看NIO包,内存映射的做法,然后 多线程跑就是了
      

  4.   

    技多不压身,学吧,有java基础很容易上手。与其没有办法,还不如学写新东西,至少能有点其他思路
      

  5.   

    在Java中提供的容器好像是很难满足这种大数据的出理,
    能否借助第三方的组件来处理呢?
      

  6.   

    加搜索引擎呀,,兄弟,呵呵,,开源的有luence呀,,不然会搞死电脑的,呵呵
      

  7.   

    有人说使用NIO的内存文件映射,可是我现在需要按行读取文件以便分析,在NIO中没有找到有readLine()方法,是不是内存映射机制不能readLine()呢?期待大家给出答案,分不够小弟再加。
      

  8.   

    可以考虑用多线程,因为I/O太频繁,可以提高CPU利用率。
      

  9.   

    到sun网站上给他们发个mail,告诉他们,jdk的io操作太烂了,300个2G文件竟然要处理1周,然后把你的问题描述下,翻译下,过几天肯定有人给你解答了
      

  10.   


    看电脑性能和你拥有的电脑台数。
    如果计算机有多台,弄个分布式程序,多台电脑一起处理。
    如果内存很大,可以把数据尽可能多的先读到内存中缓冲起来,并利用多线程不让磁盘停下来(注意:不是多个线程一起操作磁盘)
    然后尽可能用nio提供的API
    尽可能顺序读取,不要随机读取
      

  11.   


    现在的处理方式就是按行扫描数据找到符合需求的,因为需要从头扫到文件尾,而每个文件都有三千万行,所以处理上的改进是没有扫描余地了,只能通过NIO来提高读取速度,那么小弟现在就需要一个如何把一个2G的文件分块映射到内存的代码。谢了!
      

  12.   

    File file = new File("filename");  
    BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file),10*1024*1024); // 用10M的缓冲读取  可以用缓冲读取,占用内存又可以自己定义
    http://www.java2000.net/p188
      

  13.   

    内存映射文件直接将文件的地址映射到进程的地址空间中,那么操作文件就相当于在内存中操作一样,省去了读和写I/O的时间;而普通的IO操作(READFILE,WRITEFILE),这个过程是很慢的
      

  14.   

    先不要考虑技术,先考虑一下算法,找出分析文件的通性
    我以前也遇到过类似的事情
    几乎每天都要读几个2,3G的文件,跟你不一样的是我要查特定字段
    所以我把文件分拆之后用grep,分拆时用的FileChannel这个类,她读写相对较快
    2G的分拆几分钟吧,后来发现用二分法查几乎几秒就出来了
    所以最好是你根据你要分析的内容作算法,这样比较应急
    搜索引擎有一个学习过程,有时间最好掌握一个
      

  15.   

    再加上几个fuck
    比如
    fuck sun
    fuck java
    fuck java.io.*;
      

  16.   

    这毕竟是300个2G的文件我想算法的效率再高,也是抵不过时间的考验的,lz 50个小时能够处理完已经很不错了。。