Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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();
            }
        }