private bool ReadNextRunData() { this.runRecords = new BinaryHeap <Record>((int)this.reader.TotalSizeInBytes / 512); GC.Collect(); this.reader.ResumeReading(); while (true) { for (var i = 0; i < BatchSize; i++) { var record = this.reader.Read(); if (record == null) { return(this.StopReading()); } runRecords.Insert(record); } if ( MemoryInfo.GetOccupiedMemoryPercent() >= 0.8 && MemoryInfo.GetFreeMemoryLeft() < 1024 * 1024 * 1024 ) { this.reader.PauseReading(); } } }
public void Run() { MemoryInfo.Reset(); using (var sorter = new Sorter(new FileReader(this.sourceFilePath))) using (var writer = new Writer(sorter)) { foreach (var targetFile in this.outputTargetFileSet) { writer.AddTarget(targetFile); } var writtenCount = writer.Write(); Console.WriteLine($"{string.Join(", ", this.outputTargetFileSet.Select(file => file.TargetFilePath))}: Total number of written records: {writtenCount}"); } GC.Collect(); while (this.outputTargetFileSet.Sum(file => file.RunsCount) > 1) { this.SwitchTargetRoles(); using (var mrg = new Merger(this.inputTargetFileSet)) using (var writer = new Writer(mrg)) { foreach (var targetFile in this.outputTargetFileSet) { writer.AddTarget(targetFile); } var writtenCount = writer.Write(); Console.WriteLine($"Total number of written records: {writtenCount}"); } } var finalOutputFile = this.outputTargetFileSet.FirstOrDefault(file => file.RunsCount == 1) ?? this.outputTargetFileSet.First(); finalOutputFile.MakeFinal(); }