先说一下场景,日志文件中有大约三千万行数据,大小为1.2G,格式为IP,TIME,现在要针对IP字段进行数量统计重复的次数,以便制定规则来控制用户的恶意注册。
关于如何读取,并统计这三千万的数据,有三个思路:
第一个:使用JAVA的BufferedReader,分批读取数据,然后再利用map统计结果。
第二个:使用JAVA的BufferedReader,分批读取数据,然后把结果直接存入到redis的sorted set中。
第三个:多线程环境下,结合第二个思路。
第一个思路,执行不到三分钟,内存已经溢出。
第二个思路,一秒钟大约能存入到redis中1667条数据,速度还不错,一小时能统计600万左右,但要统计完成,大约需要5个小时,考虑到数据越多,读写Redis的速度就越慢,估计要6个小时左右。
第三个思路,由于redis是单线程工作,此次又全部是写入的工作,所以多线程对性能提高的能力有限,如果是有读有写,可利用Redis的主从模式,写主库,读从库,多线程也能提高效率。
三个思路都行不通,最终向一个刚来加班的大牛请教,结果利用linux命令行,15分钟统计完成。于是,我就有了时间写下这篇文章,记录一下。下面附上第二个思路的JAVA实现,以及请教大牛后的linux命令行实现。<

这篇博客记录了处理三千万行日志数据的三种方法,包括使用JAVA BufferedReader、存入Redis以及多线程方案。第一种方法导致内存溢出,第二种方法耗时约6小时,第三种方法效果有限。最终,通过Linux命令行在15分钟内完成了统计。提供了JAVA实现代码及Linux shell命令示例。

3016

被折叠的 条评论
为什么被折叠?



