假设我们每天都有大约1e10行的日志文件,每一行都包含: ID号(小于15位数的整数)、登录时间和注销时间。一些ID可以登录和注销几次。
问题1
如何计算已登录的ID总数?(每个ID不应计数两次或更多)
我试图在这里使用一个哈希表,但我发现我们应该获得的内存可能太大了。
问题2
计算在线用户人数最多的时间。
我想我们可以把一天的时间分成86400秒,然后对每一行日志文件,在在线时间间隔内每秒钟增加1秒钟。或者我可以根据登录时间对日志文件进行排序?
发布于 2013-04-14 08:30:19
- a given id may be logged in only once at any given time,
- events are stored in chronological order (that's what logs are normally) 扫描日志并保存当前登录用户数量的计数器c,以及找到的最大m数以及相关的时间t。对于每个登录,增量c,对于每次注销,它都会减少。在每个步骤中,如果m和t低于c,则更新m和c。
发布于 2013-04-14 06:48:25
你可以用*nix外壳来做。
cut -f1 logname.log | sort | uniq | wc -lcut -f2 logname.log | sort | uniq -c | sort -r发布于 2013-04-14 06:49:42
对于问题1,忘记C++并使用*nix工具。假设日志文件是分隔空间的,那么给定日志中的唯一登录数由以下方法计算:
$ awk '{print $1}' foo.log | sort | uniq | wc -lGnu排序,将高兴排序文件大于内存。以下是每一件作品所做的事情:
https://stackoverflow.com/questions/15996422
复制相似问题