Some time ago, I saw "The maximum number of 100 files in GB ". So I wrote this article.
Author: Li chengxiang
Requirement: a gb file contains all numbers, and each number is separated by a comma. Find the maximum number of 100 numbers.
Source sticker http://topic.csdn.net/u/20091013/10/d5d371dc-6dec-4034-bf31-432a47ffce96.html
Note: The method is important, so GB of data is not used for testing.
Purpose: To write the code. The test was conducted with data smaller than 1g, 1g, 1.5g, 2g, and 2G, G, and found that the speed was too slow. This post is specially sent for better code. Please do not talk on paper. Everything speaks with data.
Code:Static void main (string [] ARGs) <br/>{< br/> string Path = "data.txt "; <br/> // generate a 100000000 GB file <br/> // write (path ); <br/> // calculate the program running time <br/> stopwatch stop = new stopwatch (); <br/> stop. start (); <br/> string [] maxdata = new string [100]; // initialize the 100 largest number of containers <br/> for (INT I = 0; I <100; I ++) <br/> maxdata [I] = "0"; <br/> int nbytes = 1024*1024*512; // read GB Data each time for processing <br/> byte [] DATA = new byte [Nb Ytes]; <br/> fileinfo Fi = new fileinfo (PATH); <br/> filestream FS = Fi. openread (); <br/> int L = FS. read (data, 0, nbytes); <br/> string strdata = ""; <br/> while (L> 0) <br/> {<br/> for (INT I = 0; I <L; I ++) <br/>{< br/> If (data [I] = 44) // Encounters "," separator <br/>{< br/> If (strdata! = "") <Br/> compare (strdata, ref maxdata); <br/> strdata = ""; <br/>}< br/> else <br/> strdata + = stringdata (data [I]); <br/>}< br/> L = FS. read (data, 0, nbytes); <br/>}< br/> stop. stop (); <br/> console. writeline (STOP. elapsedmilliseconds. tostring (); <br/> console. read (); <br/> // Save the result <br/> foreach (string STR in maxdata) <br/> writelinetext ("result.txt", STR ); <br/>}< br/> /// <summary> <br/> // convert to a number <br/> /// </Summary> <br/>/ // <Param name = "data"> each binary number </param> <br/> // <returns> returns the 10 hexadecimal number </returns> <br/> static string stringdata (INT data) <br/>{< br/> int strdata = data-48; <br/> return strdata. tostring (); <br/>}< br/> /// <summary> <br/> // compare it with the minimum number of the maximum 100 numbers <br/> // </Summary> <br/> /// <Param name = "data"> Number of new reads </param> <br/> /// <Param name = "maxdata"> up to 100 </param> <br/> static void compare (string data, ref string [] maxdata) <br/>{< br/> If (data. length <maxdata [99]. length) return; <br/> else if (data. length> maxdata [99]. length) {maxdata [99] = data; sortdata (ref maxdata) ;}< br/> else <br/>{< br/> for (INT I = 0; I <data. length; I ++) <br/>{< br/> If (Int. parse (data [I]. tostring ()> Int. parse (maxdata [99] [I]. tostring () {maxdata [99] = data; sortdata (ref maxdata); break ;}< br/> else if (Int. parse (data [I]. tostring () <Int. parse (maxdata [99] [I]. tostring () break; <br/>}< br/> // <summary> <br/> // sort <br/> /// </Summary> <br/> /// <Param name = "maxdata"> the maximum number of records saved is 100. </param> <br/> static void sortdata (ref string [] maxdata) <br/> {<br/> int maxid = 99; // records the location of the minimum number greater than maxdata [99] <br/> for (INT I = 98; i>-1; I --) <br/>{< br/> If (maxdata [I]. length> maxdata [99]. length) {maxid = I + 1; break ;}< br/> else if (maxdata [I]. length = maxdata [99]. length) <br/> {<br/> bool ismax = true; // maxdata [99] Small <br/> for (Int J = 0; j <maxdata [99]. length; j ++) <br/>{< br/> If (Int. parse (maxdata [I] [J]. tostring ()> Int. parse (maxdata [99] [J]. tostring () {ismax = true; break ;}< br/> else if (Int. parse (maxdata [I] [J]. tostring () <Int. parse (maxdata [99] [J]. tostring () {ismax = false; break ;}< br/>}< br/> If (ismax) <br/>{< br/> maxid = I + 1; <br/> break; <br/>}< br/> maxid = I; <br/>}< br/> string data = maxdata [99]; <br/> for (INT I = 99; I> maxid; I --) <br/>{< br/> maxdata [I] = maxdata [I-1]; <br/>}< br/> maxdata [maxid] = data; <br/>}< br/> /// <summary> <br/> // write data (each number is randomly generated and the length is (1-100) <br/> /// </Summary> <br/> // <Param name = "path"> Data Writing path </param> <br/> // /<Param name = "N"> Number of writes </param> <br/> static void write (string path, int N) <br/>{< br/> writetext (path, "0"); </P> <p> random rlength = new random (); <br/> random RDATA = new random (); // <br/> for (INT I = 0; I <n; I ++) // generate n random numbers <br/>{< br/> int length = rlength. next (1,100); // generate a single-digit (1-100) number <br/> string strdata = ","; <br/> for (Int J = 0; j <length; j ++) <br/>{< br/> If (j = 0 & length> 1) strdata + = RDATA. next (1, 9 ). tostring (); // if the number of digits is greater than 1, the first digit cannot be zero <br/> else <br/> strdata + = RDATA. next (0, 9 ). tostring (); <br/>}< br/> writetext (path, strdata ); <br/>}< br/> static void writetext (string path, string text) <br/>{< br/> using (streamwriter write = new streamwriter (path, true, encoding. default) <br/>{< br/> write. write (text ); <br/>}< br/> /// <summary> <br/> // save up to 100 data records <br/> // </Summary> <br/> /// <Param name = "path"> saved path </param> <br/> /// <Param name = "text"> number </param> <br/> static void writelinetext (string path, string data) <br/>{< br/> using (streamwriter write = new streamwriter (path, true, encoding. default) <br/>{< br/> write. writeline (data); <br/>}< br/>}