private async Task <IEnumerable <IChunkReference <T> > > PushChunksToStackAndMerge(ChannelReader <List <T> > channelReader) { try { var stopwatch = Stopwatch.StartNew(); var chunkStack = _chunkStackFactory.CreateChunkStack(); var tempChunStack = _chunkStackFactory.CreateChunkStack(); var appender = new ChunkStackAppender(chunkStack, tempChunStack); while (await channelReader.WaitToReadAsync().ConfigureAwait(false)) { if (channelReader.TryRead(out var chunk)) { _logger.Debug($"Starting to merge chunk with {chunk.Count} lines"); appender.PushToStackRecursively(chunk); _logger.Debug($"Chunk was merged in {stopwatch.Elapsed}"); stopwatch.Restart(); } } if (_onlyMemoryMerge) { return(chunkStack.ToArray().Concat(tempChunStack.ToArray())); } return(new[] { appender.ExecuteFinalMerge() }); } catch (Exception ex) { _logger.ErrorException("Error occured while merging: ", ex); throw; } }
public ISortMethod <T> CreateSortMethod <T>(ChunkStack <T> chunkStack, IChunkStackFactory <T> chunkStackFactory) where T : IComparable { switch (_sortMethod) { case SortMethod.MergeSort: { return(new OppositeMergeSort <T>( chunkStack, chunkStackFactory.CreateChunkStack(), _onlyMemoryMerge)); } case SortMethod.MergeQuickSort: { if (_quickSortSize != null) { return(new OppositeMergeQuickSort <T>( chunkStack, chunkStackFactory.CreateChunkStack(), _quickSortSize.Value, _onlyMemoryMerge)); } return(new OppositeMergeQuickSort <T>( chunkStack, chunkStackFactory.CreateChunkStack(), onlyMemoryMerge: _onlyMemoryMerge)); } case SortMethod.ConcurrentMergeQuickSort: { if (_quickSortSize != null) { return(new ConcurrentOppositeMergeQuickSort <T>( chunkStack, chunkStackFactory, _channelCapacity, _sortConcurrency, _mergeConcurrency, _quickSortSize.Value, _onlyMemoryMerge)); } return(new ConcurrentOppositeMergeQuickSort <T>( chunkStack, chunkStackFactory, _channelCapacity, _sortConcurrency, _mergeConcurrency, onlyMemoryMerge: _onlyMemoryMerge)); } default: throw new NotSupportedException(); } }