就是 现在有一个log 里面全都是访问者的ip(数据很大很大) 一行一个ip
比如
123.22.22.187
123.22.22.182
123.22.21.187
123.22.42.187
123.23.22.187
123.22.22.182
121.22.22.182
....
怎么查出来访问次数最多的10个IP?
方式:
第一步:
如下读取:
声明一个变量 dictionary <string ,long> record
123.22.22.187
123.22.22.182
123.22.21.187
123.22.42.187
123.23.22.187
123.22.22.182
121.22.22.182
先与蓝色部分为key ,key 出现的次数为value 存在 record中。
这样 ,record的最大个数是255个,不算多,更说不上要多少内存。
再来一次大扫除,
使record 剩下 最多的 10 个元素
以这10 个元素为条件,再扫描一次表,把符合条件的数据写到另一个[文件A]中,
第二步:
扫描 [文件A] 以下面数据蓝色部分为key ,以出现次数为value 写到 变量 dictionary <string ,long> record 中
123.22.22.187
123.22.22.182
123.22.21.187
123.22.42.187
123.23.22.187
123.22.22.182
121.22.22.182
。。。
第三步:
。。。
第四步:
。。。
就这样,
用4 步相同的方法,提出最多的数据:10条,
问题,上面这种方式感觉不行啊,是我没理解吗??
比如说:
123,125,196,158,假设这个ip地址出现的次数最多,那么如下,
121,123
121,14
121,56
123,125,196,158,
123,125,196,158,
如果分段比较次数,那么123,125,196,158, 这个ip在第一步就被淘汰了?
La bonne réponse est la suivante : sort|uniq -c
a.b.c.d
Traiter une première.
Tous les fichiers sont divisés en plusieurs lectures (par exemple 255 fois).
Les enregistrements sont ensuite stockés dans 255 fichiers, correspondant à un (tel que 1.b.c.d ; 2.b.c.d ;)
De cette façon, vous pouvez obtenir les dix plus grands.
Ensuite, traitez avec b.
. . .
J'ai enfin la réponse.
Ce type de problème peut utiliser un tas max-min.
Idée de base
对所有的ip进行分组,统计出现次数,ip做key,出现次数做val,保存在关联数组中
数组按照键值(出现次数)降序排序,取出前 10 条记录
Bien que ce ne soit pas
.java语言描述的
,javascript描述
devrait être compréhensible Quoi qu'il en soit, je l'ai testé et il peut produire votre effet :Ce qui suit est l'exemple de code complet :
map-reduce ou sort | uniq -c
Utiliser évidemment hadoop (map-reduce) ?
Triez-le d'abord, ce sera plus facile à gérer après le tri.
Cette question doit être divisée en deux parties pour comprendre,
1 Le fichier est très volumineux et l'efficacité de lecture est faible
2 Trouvez les 10 premiers enregistrements avec le plus d'occurrences
Question 1 : Pour la lecture de fichiers volumineux, vous pouvez utiliser l'implémentation Java AIO pour lire les fichiers de manière asynchrone
Question 2 : LindedList doit être étendue chaque fois qu'un enregistrement est ajouté, vérifiez d'abord s'il existe un enregistrement et, si c'est le cas, avancez la position de l'enregistrement (. cela ressemble plus à l'algorithme de mise en cache Java Memcached)
Ces types de problèmes ont tous la même idée, « diviser pour mieux régner ».
Chaque IP équivaut à un nombre entier de 32 bits. Parcourez toutes les IP dans le journal, divisez-les en n fichiers selon la plage de valeurs et enregistrez-les (assurez-vous que chaque fichier est suffisamment petit dans ce cas). la même adresse IP sera définitivement divisée dans le même fichier ; puis traitez ces n fichiers un par un, et comptez les 10 premières adresses IP qui apparaissent dans chaque fichier, enfin, obtenez le top 10 de ces 10*n IP ;
Utilisez des expressions régulières pour déterminer le premier nombre au début de l'IP :
L'IP la plus fréquente est le numéro en début de ligne