这些答案想的太复杂了。你仔细算一下,ip地址是4个字节,也就是最多4G个。开一个16GB的数组,每个ip的4字节组成的32位数就是这个数组的索引,数组中每个元素32位整数,记录并自增这个索引对应的ip出现的次数。这样,你读一边10GB日志,也就算出最大的是谁了。找最大应该不用教对吧?
这样,如果磁盘够快,30秒以内就应该出数据了。
采样随机位置从样本里取出10块数据,每块数据1k,数据块之间不重合。
然后统计一下这10块数据中哪个IP地址出现的次数最多即可。
10g的日志,应该是文本类型的。10g的文本文件遍历一遍基本上必须的。逐行读取,正则匹配出IP地址转行成数字类型,变成数组,读取每一行都判断数组中是否存在,如果有计数器加一,如果没有新建一个。虽然有一些算法可以减少遍历,比如在遍历到超过一半之后,如果发现有IP超过了总数的一半儿,后面就不需要遍历了,比如剩余30%之后,所有跟第一名差距超过30%的可以都不计数了,但是这种情况基本在最后才会遇见,判断的时间超过计数器的时间。性价比最好的就是遍历一般计数器来实现。
用数据库技术最简单,日志表对ip字段建索引,然后一句 select count(*) from 日志表 group by ip order by count(*) desc就行了
10G的数据不算大,有很多办法,除了楼上的几种方法外,还可以用大数据思维来处理,搭建hadoo集群(也可以用单机模式),用hadoop来计算,这样就很简单了,别说10G,就是100G都是很easy的事情了
这个问题所用算法应该可以归结为经典的wordcount,不复杂,网上搜一下代码即可,不再赘述。
至于具体实现,有两种路线。第一是自己在网上开源代码基础上写一个专用程序,运行在大内存机器上,程序把数据全部加载到内存中,实现内存计算,为了加快速度,可以使用多线程。第二条路线是用支持内存计算的框架,比如spark,这样程序更简单,而且可以实现多机分布式并行检索,代价是需要学习不少东西。
网上的答案需要十几分钟是什么答案?能阐述一下吗?
存储日志一般来说用ELK的概率比较高。
elk日志系统几秒就得到你要的结果
ipv4地址可以转换成10进制数字,每个整形数字表示一个ip,最小ip0.0.0.0最大ip是255.255.255.255,对应整形数字0~2^32-1。分配长度2^32-1长度map key为书ip转换后的数字,value为登录次数,初始值为0。开始遍历登录ip转换为数字后,相应map key 计数加1最后找到所有key中计数最大一个
很简单,主要看日志的格式了,如果是csv的话就按照行读取;如果I/O可以的话你可以采用托管方式,一次读取20~200行,再通过托管任务在内存中用hash表方式存储count值就行了,而且内存中可以采用ip=>int32的方式存储,这样可以大大降低内存占用率。一次循环10G的数据也不是很慢的