コード例 #1
0
        private void Sort(RecordsReader recordsReader, int field, StreamWriter output,
                          int workersCount, long bufferSizeInBytesPerWorker)
        {
            Stopwatch sortSw = new Stopwatch();

            sortSw.Start();
            RecordsBuffer firstBlock;
            int           blockCount = workersCount > 1
        ? SortBlocksParallel(recordsReader, field, workersCount, out firstBlock)
        : SortBlocksSequential(recordsReader, field, out firstBlock);

            sortSw.Stop();
            if (blockCount == 1)
            {
                RecordsWriter recordsWriter = new RecordsWriter(output);
                recordsWriter.WriteRecords(firstBlock);
            }
            else
            {
                Console.WriteLine($"{blockCount} blocks sorted in {sortSw.Elapsed}");

                Console.WriteLine("Merging...");
                Stopwatch mergeSw = new Stopwatch();
                mergeSw.Start();
                MergeBlocks(blockCount, field, output, bufferSizeInBytesPerWorker);
                mergeSw.Stop();
                Console.WriteLine($"{blockCount} blocks merged in {mergeSw.Elapsed}");
                _tempStreams.ClearBlocks();
            }
        }
コード例 #2
0
 private void WriteBlock(RecordsBuffer block, int blockIndex)
 {
     using (Stream blockStream = _tempStreams.CreateBlockStream(blockIndex))
         using (StreamWriter sw = new StreamWriter(blockStream))
         {
             RecordsWriter recordsWriter = new RecordsWriter(sw);
             recordsWriter.WriteRecords(block);
         }
 }
コード例 #3
0
 public BufferedRecordsWriter(TextWriter textWriter, long bufferSizeInBytes)
 {
     _recordsWriter     = new RecordsWriter(textWriter);
     _bufferSizeInBytes = bufferSizeInBytes;
     _recordsBuffer     = new RecordsBuffer(bufferSizeInBytes);
 }