环境:Solaris 10问题:目录下有一个7G大小的日志文件,里面是文本格式的数据,一条条的现在想用一个Java来读取并处理它,由于文件太大,又要保证性能,请在经验的朋友进来看看

解决方案 »

  1.   

    用C++,或者python. 根据我以往用Java的经验来看,处理大量数据的时候的Java,最后都会被逼到GC这个地步的。
    真的到了GC的时候,Java程序就慢下来了,平时不启动GC的时候,Java就已经稍微有些慢了。
    此外,你需要缓存数据的话,可以尝试Java版的BerkleyDB。或者用Python,Python虽然整体比Java慢,但是处理文本它很快,而且它实际上是引用计数实现的。
    你不用的数据就立即被释放的。也就是说,你处理的极限是它的极限。但是带有GC的语言,往往没有到极限的时候,很多对象实际早就没用了,还依然占用内存,等到gc的时候,就歇菜了。
      

  2.   

    CSDN怎么变成这处德性了,
    发的贴子都没办法修改,tmd
      

  3.   

    以前是可以修改自己发的贴子的
    我几年没来了,没想到成这个样子.
    引起这个问题的起因主要是syslog-ng监控日志文件的效率太低引起的.
    于是就想着自己写个程序来处理,参考了一下Java内存映射的方式,但最大听说只支持2G还是不行,看看还有没有其它办法
      

  4.   

    有没有些具体的要求啊?不会用 Solaris,也不知道 syslog-ng 是做什么的。
      

  5.   

    呵呵,主要是一个很大系统产生的日志我们要处理分析这些日志,我去拜读老兄的贴子.7G只是目前的状况,有可能要操作比7G更大的数据,10G也是有可能的.
      

  6.   


    刚刚阅读了老兄的贴子,我担心这样处理的效率问题,因为一天就有7g的数据量,我必须要用很高的效率来完成,并且数据读取出来还要进行相应的规则匹配,过滤,入库等操作,不知道还有没有什么别的好办法.另外还有个情况:
    此文件可能是时时增长的,也就是说在solaris下,syslog会不停的向这个文件中写内容,同时我们的处理程序要不停的把日志的内容读取出来,不知道写入和读取同时进行的情况下效率会怎么样
      

  7.   

    使用BufferedReader 设置缓冲区大一些(比如10M),7G是很大,但是时间瓶颈肯定不会是java读取文件慢,主要还是自己的操作是不是太复杂,耗时
      

  8.   

    对你说的很多东西都只能用崇拜的眼神看着这些名字
    不明白C++与JAVA在处理文件读取上的区别,至少从接口上,没有看出来不知道你是要匹配的高效率呢还是要读取的高效率,如果读取能够跟上匹配的速度, 那么我觉得对于读取的方法的选择就是正确而到位的.
    我是个菜鸟,希望LZ能够比较下现在的速度瓶颈在哪里.
    作为一个菜鸟,我想问的事情比较幼稚:
    像OPENGL这样的图形引擎在处理数据较大的图象数据时,提供了双缓存模式,一个用于读取,一个用于处理,不知道JAVA有没有这样的缓存机制呢??
    如果这样都不能满足匹配的速度的话...惊讶于LZ家的匹配算法太高效了点....可以发出来大家学习学习我是菜鸟,菜言无忌
      

  9.   


    初步用Java做了一下测试,读取文件方面还是挺快的4G大小的文件,用了907秒,性能还是不错的,现在的问题是,Java如何来监控一个文件的增长,当文件被写入新的数据时,如何让程序把新加入的数据取出并做相应的处理?不知道有谁有过此方面的经验
      

  10.   


    没经验..
    一般写文件的时候都会把文件锁定...没研究过Solaris源码,不好评论
    你可以看看Solaris内核,肯定能有更有效的方法解决
      

  11.   

    你的日志设置有问题,你不能所有的日志都写到一个文件,可以参考 log4j的做法
    1 每天写一个
    2 每月写一个
    3 每1G 写一个
    就连Oracle 都要使用 partition 技术来分割数据库文件,我们为何不自己也分割呢?
      

  12.   


    我们当然不愿意处理这么大的文件,但这是客户的需求,没办法,他们就要这样做。Java监控文件的增长不好解决
      

  13.   

    不知道用C处理是否会快一点,然后用JNI调一下就行了。另外,监控文件增长的情况,不能用文件锁么?写的时候不读,读的时候不写。
      

  14.   

    用awk吧,不知道为什么你会选择java来做这件事情,还有一个办法使用tail和head命令来分批处理也可以啊。
      

  15.   

    以前遇到过这样的问题
    用java读取一定格式的数据文件,更新到数据库中。学习中.......
      

  16.   

    gawk,后台服务日志一直用它开汇总
      

  17.   

    好久没来了,此问题已经用Java程序解决了日志达到7G时,Java程序仍能很好的进行处理,并且把新增加的内容过滤出来而且效率也比较高,每秒可以处理3000多条,完全达到性能要求,感谢大家关注!!
      

  18.   

    java nio 对这些做得很不错了,性能我想用缓存就OK了,
    缓的大小可以跟据活动空间调整,
    这样可能相对可以提高一点点
      

  19.   

    呵呵已经解决了思路:监控日志文件的变化,把每次读的位置记下来然后每次定位到新更新的地方,把增加的内容读出来即可用普通的IO包即可完成,无需NIO包.