这个问题的难度是数据量太大,而且还不能使用第三方工具。
如果不考虑时间的话,简单的想了一个思路:
1、首先将12G的日志文件切分成比如:100份,每份120M左右。如果内存太少,可以切分成更多份。
2、由于切分后的每个文件比较小,因此可以针对每个切分后的文件进行统计,得出每个切分后的文件的统计数据。(在统计时注意不需要一次读入所有的数据,可以按行读取,统计完就丢弃)
3、合并统计数据,如果统计数据比较大,可以考虑合并每份文件的统计中登录次数最多的前n个用户(比如:前100个)。合并后可以得出活跃用户了。活跃用户的登录次数也同时可以计算出来了。如果统计出的活跃用户在某个切分后的文件中的前100条中没有,那可以单独再取一下该切分文件针对该用户的统计结果,或者是再多取一些(比如前500条),重新统计。
4、统计某个指定用户的登录记录比较好做,就是逐个遍历每份切分后的文件,只统计该用户的登录记录(可分批写入文件)。
这个方法没有测试,可能会时间比较长一些。如果时间太长,可以考虑统计多份文件时采用多线程同时处理。
另外,统计的结果数据主要是用户名、登录次数,之所以要切分是假设统计的结果数据可能会比较大,内存会不够,比如上百万的用户。如果实际上统计的结果数据并不大的话,不切分应该也行。另外一个就是切分后可以并行处理。
合并统计数据之所以取前n条数据进行合并,也是假设结果数据量很大。