日期:2014-05-17  浏览次数:20406 次

问一个Ebay的面试题 当时没答上来
就是 现在有一个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?

数据量非常大 不可能直接读进来 然后排序。。。

------解决方案--------------------
   string baseDirec = Environment.CurrentDirectory;
            baseDirec = baseDirec.Substring(0, baseDirec.IndexOf("bin"));
            string path = baseDirec + "\\Resource\\data.log"; //这个是我site 下的资源文件下专门记录ip转换来的log文件
            byte[] byteData = File.ReadAllBytes(path);
            string visitedIPList = Encoding.ASCII.GetString(byteData);//这用什么编码看自己
            string[] ipArr = visitedIPList.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            Dictionary<string, ushort> record = new Dictionary<string, ushort>(); // 以ipFirst为key,以出现的count为value
            ushort count = 0; //出现的频率      
            //因为数据量达到108W所以采取分段的方式来process
           // Console.WriteLine(DateTime.Now.Second);
            int processline = 5000; //每次处理5000行
            for (int i = 0; i < processline; i++)
            {
                //这个判断用于防止 (第n个与第n-1个是相同的ipKey)可以省去不必要的循环
                if (ipArr[i + 1] == ipArr[i]) { continue; }