问一个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; }
string ipKey = ipArr[i].Substring(0, ipArr[i].IndexOf("."));
for (int j = 0; j < processline; j++)
{
string ipKeyCopy = ipArr[j + 1].Substring(0, ipArr[j + 1].IndexOf("."));
if (ipKey == ipKeyCopy) count++;
}
//判断是否存在该key
if (!record.ContainsKey(ipKey))
//添加统计的key和频率到record散列表中
record.Add(ipKey, count);
count = 0;
}
foreach (string key in record.Keys)
{
Console.WriteLine("key:{0},value:{1}", key, record[key]);
}
//Console.WriteLine(DateTime.Now.Second);