Beispiel #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;
            }
        }
Beispiel #2
0
 protected MergeSortBase(ChunkStack <T> chunkStack, ChunkStack <T> tempChunkStack, bool onlyMemoryMerge)
 {
     _appender       = new ChunkStackAppender(chunkStack, tempChunkStack, onlyMemoryMerge);
     _tempChunkStack = tempChunkStack;
     _chunkStack     = chunkStack;
 }