100G的大文件中找出最大的100个数

 前段时间看到“100G的大文件中找出最大的100个数"。所以写下这篇文章。

 

转载请注明出处   作者: 黎承湘

 

要求 : 有一个100G大小的文件里存的全是数字,并且每个数字见用逗号隔开。现在在这一大堆数字中找出100个最大的数出来。

        源贴http://topic.csdn.net/u/20091013/10/d5d371dc-6dec-4034-bf31-432a47ffce96.html

 

说明:重在方法,所以没有用100G的数据来进行测试。

 

目的:写完代码。分别用,小于1G,1G,1.5G ,2G,2.5G的数据进行测试,发现速度太慢。特发此贴,求更优秀的代码。请各位朋友,不要纸上谈兵。一切以数据说话。

 

代码: static void Main(string[] args) { string path = "data.txt"; //生成100G文件 //write(path,100000000); //计算程序运行时间 Stopwatch stop = new Stopwatch(); stop.Start(); string[] MaxData = new string[100]; //初始化100个最大数的容器 for (int i = 0; i < 100; i++) MaxData[i] = "0"; int nBytes = 1024 * 1024 * 512; //每次读取0.5G数据进行处理 byte[] data = new byte[nBytes]; FileInfo fi = new FileInfo(path); FileStream fs = fi.OpenRead(); int l = fs.Read(data, 0, nBytes); string strData = ""; while (l > 0) { for (int i = 0; i < l; i++) { if (data[i] == 44) //遇到","分隔符 { if (strData != "") Compare(strData, ref MaxData); strData = ""; } else strData += stringData(data[i]); } l = fs.Read(data, 0, nBytes); } stop.Stop(); Console.WriteLine(stop.ElapsedMilliseconds.ToString()); Console.Read(); //把结果保存起来 foreach (string str in MaxData) WriteLineText("result.txt", str); } ///

/// 转为数字 /// /// 每个二进数 /// 还回10进制数 static string stringData(int data) { int strdata = data - 48; return strdata.ToString(); } /// /// 跟最大的100个数中的最小数进行比较 /// /// 新读取的数 /// 最大的100个数 static void Compare(string data ,ref string[] MaxData) { if (data.Length < MaxData[99].Length) return; else if (data.Length > MaxData[99].Length) { MaxData[99] = data; SortData(ref MaxData); } else { for (int i = 0 ; i < data.Length ; i++) { if (int.Parse(data[i].ToString()) > int.Parse(MaxData[99][i].ToString())) { MaxData[99] = data; SortData(ref MaxData); break; } else if (int.Parse(data[i].ToString()) < int.Parse(MaxData[99][i].ToString())) break; } } } /// /// 排序 /// /// 保存最大的100个数 static void SortData(ref string[] MaxData) { int maxID = 99; //记录比MaxData[99]大的最小数的位置 for (int i = 98; i > -1; i--) { if (MaxData[i].Length > MaxData[99].Length) { maxID = i + 1; break; } else if (MaxData[i].Length == MaxData[99].Length) { bool ismax = true ; //MaxData[99]小 for (int j = 0; j < MaxData[99].Length; j++) { if (int.Parse(MaxData[i][j].ToString()) > int.Parse(MaxData[99][j].ToString())) { ismax = true ; break; } else if (int.Parse(MaxData[i][j].ToString()) < int.Parse(MaxData[99][j].ToString())) { ismax = false; break; } } if (ismax) { maxID = i+1; break; } } maxID = i; } string data = MaxData[99]; for (int i = 99; i > maxID; i--) { MaxData[i] = MaxData[i - 1]; } MaxData[maxID] = data; } /// /// 写数据(每一个数都是随机生成,长度为(1-100) /// /// 写数据的路径 /// 需要写多少个数 static void write(string path , int n) { WriteText(path, "0"); Random rlength = new Random(); Random rdata = new Random(); // for (int i = 0; i < n; i++) //生成N个随机数 { int length = rlength.Next(1, 100); //生成一个位数(1-100)的数字 string strdata = ","; for (int j = 0; j < length; j++) { if (j == 0 && length > 1) strdata += rdata.Next(1, 9).ToString(); //如果位数>1那么首数字不能为零 else strdata += rdata.Next(0, 9).ToString(); } WriteText(path, strdata); } } static void WriteText(string path, string text) { using (StreamWriter write = new StreamWriter(path, true, Encoding.Default)) { write.Write(text); } } /// /// 保存最大的100个数 /// /// 保存的路径 /// 数字 static void WriteLineText(string path, string data) { using (StreamWriter write = new StreamWriter(path, true, Encoding.Default)) { write.WriteLine(data); } }  

 

 

你可能感兴趣的:(100G的大文件中找出最大的100个数)