コード例 #1
0
        public MergeSortReader(int SortIndex, int FileCount, long SortMask)
        {
            this.SortMask = SortMask;
            Creator       = new MergedEnumerator(SortIndex, FileCount, SortMask);
            Reader        = Creator.Enumerator;
            //最初はここで強制的に読ませる
            ActualRead();
            var Sorted = SortedMemory.Span;

            if (0 < Sorted.Length)
            {
                LastValue = ~Sorted[0];
            }
        }
コード例 #2
0
        public MergedEnumerator(int SortIndex, int FileCount, long SortMask)
        {
            //マージソート階層を作る
            var SorterQueue = new Queue <MergeSorterBase>();

            for (int i = 0; i < FileCount; i++)
            {
                SorterQueue.Enqueue(new MergeSortFileReader(SplitQuickSort.SortingFilePath(SortIndex, i), SortMask));
            }
            var TempSorter = new List <MergeSorterBase>();
            var NextSorter = new List <MergeSorterBase>();

            //きれいなマージソート階層を作るようにした(一応)
            while (1 < SorterQueue.Count)
            {
                //1回でマージしきれないときはファイル数を均等に振って並列に処理したい
                int temp        = (SorterQueue.Count + MergeSortCompareUnit - 1) / MergeSortCompareUnit;
                int CompareUnit = (FileCount + temp - 1) / temp;
                while (0 < SorterQueue.Count)
                {
                    for (int i = 0; 0 < SorterQueue.Count && i < CompareUnit; i++)
                    {
                        TempSorter.Add(SorterQueue.Dequeue());
                    }
                    if (2 <= TempSorter.Count)
                    {
                        NextSorter.Add(new MergeSorter(TempSorter));
                    }
                    else
                    {
                        NextSorter.Add(TempSorter.First());
                    }
                    TempSorter.Clear();
                }
                SorterQueue = new Queue <MergeSorterBase>(NextSorter);
                NextSorter.Clear();
            }
            //マージ階層の最後はバッファーを噛ませて並列で処理するつもり
            Enumerator = new MergeSortBuffer(SorterQueue.Dequeue());
        }