private void MergeBlocks(List <IEnumerator <Record> > blockRecordsEnumerators, BufferedRecordsWriter recordsWriter, int field) { IRecordFieldComparer comparer = _recordComparer.CreateRecordFieldComparer(field); var currentRecordComparer = new SelectComparer <int, Record>( i => blockRecordsEnumerators[i].Current, comparer); var heap = new MinHeap <int>(blockRecordsEnumerators.Count, currentRecordComparer); for (int i = 0; i < blockRecordsEnumerators.Count; i++) { blockRecordsEnumerators[i].MoveNext(); heap.Add(i); } while (heap.Size > 0) { recordsWriter.WriteRecord(blockRecordsEnumerators[heap.Root].Current); bool empty = !blockRecordsEnumerators[heap.Root].MoveNext(); if (empty) { heap.Extract(); } else { heap.DownHeap(); } } }
private void MergeBlocks(int blockCount, int field, StreamWriter output, long bufferSizeInBytes) { long blockSize = bufferSizeInBytes / (blockCount + 1); List <Stream> blockStreams = new List <Stream>(); try { List <IEnumerator <Record> > blockRecordsEnumerators = new List <IEnumerator <Record> >(); for (int i = 0; i < blockCount; i++) { Stream blockStream = _tempStreams.OpenBlockStream(i); blockStreams.Add(blockStream); StreamReader blockStreamReader = new StreamReader(blockStream); RecordsReader blockReader = new RecordsReader(blockStreamReader, blockSize); blockRecordsEnumerators.Add(blockReader.ReadRecords().GetEnumerator()); } using (BufferedRecordsWriter recordsWriter = new BufferedRecordsWriter(output, blockSize)) { MergeBlocks(blockRecordsEnumerators, recordsWriter, field); } } finally { foreach (Stream s in blockStreams) { s.Dispose(); } } }