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]; } }
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()); }