/// <summary> /// Посчитать и отсортировать /// </summary> /// <param name="pathApp"></param> static void Sort(string pathApp) { FileInfo fi = new FileInfo(pathApp + "/bigdata.txt"); if (fi.Exists) { // делаем ограничение по памяти, когда достигнем, то начинаем скидывать файлы // Reducer'ов на жесткий double memorySizeGb = 0; do { Console.Write("Сколько оперативки не жалко (Гб) ?: "); } while (!Double.TryParse(Console.ReadLine(), out memorySizeGb) || memorySizeGb <= 0); ReducerManager reducersManager = new ReducerManager(memorySizeGb); List <Task> tasks = new List <Task>(); Console.WriteLine(DateTime.Now); // Распределяем на 4 (хотя смотря сколько потоков есть) Mapper for (int i = 0; i < 4; i++) { int ind = i; Task task = Task.Run(() => { using (StreamReader reader = new StreamReader(pathApp + "/bigdata.txt", Encoding.UTF8)) { long sizeBlock = reader.BaseStream.Length / 4; reader.BaseStream.Seek(3 + sizeBlock * ind, SeekOrigin.Begin); if (ind != 0) { while ((char)reader.Read() != '\n') { ; } } Mapper m1 = new Mapper(reader, reducersManager, sizeBlock); m1.Process(); } }); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); reducersManager.WriteResult(); Console.WriteLine(DateTime.Now); } else { Console.WriteLine("Файл не сгенерирован!"); } }
public Mapper(StreamReader reader, ReducerManager reducerManager, long sizeBlock) { this.reader = reader; this.reducerManager = reducerManager; this.sizeBlock = sizeBlock; }