private static string[] InitialSort(string inputFile, string tempDir, Options opt) { List<string> tempFiles = new List<string>(); var sw = new System.Diagnostics.Stopwatch(); sw.Start(); //read a chunk, sort it, then write it to file using (StreamReader reader = new StreamReader(inputFile)) { using (ManualResetEvent mre = new ManualResetEvent(true)) { NameGen nameGen = new NameGen(tempDir); string line; int lineNo = 0; int maxSortSize = opt.MaxSortSize; SortParam[] parameters = new SortParam[2]; parameters[0] = new SortParam(maxSortSize, mre, 0); parameters[1] = new SortParam(maxSortSize, mre, 1); int currentParam = 0; int[] buffer = parameters[currentParam].buffer; int j = 0; while ((line = reader.ReadLine()) != null) { lineNo++; int data; //if (Int32.TryParse(line, out data)) //slow if (StringToInt(line, out data)) { buffer[j++] = data; if (j >= maxSortSize) { string name = nameGen.NewName(); tempFiles.Add(name); parameters[currentParam].Reset(j, name); SortOnThread(parameters[currentParam]); //swap currentParam = (currentParam + 1) % 2; buffer = parameters[currentParam].buffer; j = 0; } } else Warn("Skipping line " + lineNo.ToString()); } if (j > 0) { string name = nameGen.NewName(); tempFiles.Add(name); parameters[currentParam].Reset(j, name); SortOnThread(parameters[currentParam]); } mre.WaitOne(); parameters[0].mre = null; parameters[1].mre = null; } reader.Close(); } sw.Stop(); Console.WriteLine("Time to sort intermediate files: {0}", sw.Elapsed.ToString()); return tempFiles.ToArray(); }