Пример #1
0
        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();
                }
            }
        }
Пример #2
0
        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();
                }
            }
        }