Esempio n. 1
0
        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();
                }
            }
        }
Esempio n. 2
0
        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();
        }