今天给了一个解析大文件的工作
一:任务要求:
读取16G的日志文件(按行读取,每一行都是这些参数的信息),然后根据两个参数作为key(这两个参数能表示是同一台机器),算出同一台机器的时间差(收到时间减去发出时间)。然后统计每一台机器发出时间的差的总值、平均值、最大值、最小值。二:问题
1.读取特大文件(这里16G)没遇到过
2.读取出来的数据,采用什么方式存储。
3.由于文件太大,不能再控制台上打印,因为控制台上打印的数目有限(在这里就吃亏了,后面有个需求打印所有时差值,本来有上千万条数据,但控制台只能输出5万多行数据)。所以要输出到文件里
三:解决问题
1.大文件读取在网上都到了一个方法,用commons-io-1.4.jar包。详情看外边读取大文件方法
2.前面要求里得要以两个参数为key,然后首先想到了Map,value就用一个bean来代替。对于要求得到总值、平均值、最大值、最小值,这些都是一个数据,用bean完全可以。(拓展:这里要求如果还要加上每一个机器的时间差然后打印或输出到文件里该怎么办呢?网上搜到)
3.首先判断当前读的key中有无数据,判断为空就创建bean把基本的数据放入bean,第二次读取判断有数据时候从,得bean中得到总时差然后+1然后再添加到bean中这样下去就能得到同一台机器的总时差了,最大时差-首先从bean中得到最大时差然后进行判断,如果本次循环的时差大于bean里的就存入bean,则而反之,最小时差类似。平均时差得循环完后总时差/循环次数就可以了,所以在bean里也要写一个count属性来计数,每次循环也要+1。
四:学到知识
1.读取超大文件方(当然小文件也能用)
2.进一步熟悉了关于javabean和Map和连用
3.关于写出到文件中这里用PrintWriter,用他的好处他能换行输出
4.输出格式为a,b,c,e(以","分割),输出在txt会其他文本上,把后缀名改成.csv就能自动划分成表格形式
5.集合存储有限,map集合放key的时候,如果key太长,在这个16G文件上key占用内存会很多,会内存不够时,JVM会一直GC,这时候读取会极慢,甚至等了半小时都没读取出来。所以本来要存入的key是3个参数组成的,但是可以用2个参数组成(另一个参数放入bean中,然后取出来判断进入).
五:拓展
1.一个key对应多个值:MultiValueMap http://android.jobbole.com/83470/