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(); } }
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); } }
public BufferedRecordsWriter(TextWriter textWriter, long bufferSizeInBytes) { _recordsWriter = new RecordsWriter(textWriter); _bufferSizeInBytes = bufferSizeInBytes; _recordsBuffer = new RecordsBuffer(bufferSizeInBytes); }