Для List<T>
мне нужно реализовать сортировку нескольких столбцов, где имена столбцов и направление сортировки известны во время выполнения. Я использую System.Linq.Dynamic OrderBy
API, который может принимать имена столбцов и направление сортировки в сцепленной строку, поэтому следующий код работает:Multi column Параллельная сортировка для списка <T>
List<T> data = DataCollection; // Stored in Cache
var sortedData = data.OrderBy("Col1 asc, Col2 desc, Col3 asc,Col4 asc");
Вызова, когда размер увеличения данных до 1 million+
записей, то та же операция сортировки значительно замедляется , правильно, так как нет волшебной палочки.
Теперь я пытаюсь понять, есть ли способ для такой же работы в режиме Parallel
. Ниже приведены варианты, я рассматриваю:
Вариант 1:
- Divide сбор данных в небольших подмножеств как 100 К каждому и запустить Сортировать по каждому, но задача состоит в том, чтобы объединить индивидуальные наборы, в моем понимании есть не удобный механизм не интегрировать отсортированные подмножества
Вариант 2
Как я нагул для вариантов, наткнулся на следующем параллельном шаблоне для List<int>
, где рекурсивный Parallel Сортировка также вызывает рекурсивные последовательные сортировать внутренне:
public class CustomSort
{
// Fetch Partition
public static int Partition(List<int> list, int left, int right)
{
int start = left;
int pivot = list[start];
left++;
right--;
while (true)
{
while (left <= right && list[left] <= pivot)
left++;
while (left <= right && list[right] > pivot)
right--;
if (left > right)
{
list[start] = list[left - 1];
list[left - 1] = pivot;
return left;
}
int temp = list[left];
list[left] = list[right];
list[right] = temp;
}
}
// Quick Sort serial
public static void QuickSort(List<int> list, int left, int right)
{
if (list == null || list.Count <= 1)
return;
if (left < right)
{
int pivotIdx = Partition(list, left, right);
QuickSort(list, left, pivotIdx - 1);
QuickSort(list, pivotIdx, right);
}
}
// Quick Sort Parallel
public static void QuickSortParallel(List<int> list, int left, int right)
{
if (list == null || list.Count <= 1)
return;
if (left < right)
{
int pivotIdx = Partition(list, left, right);
Task leftTask = Task.Run(() => QuickSort(list, left, pivotIdx - 1));
Task rightTask = Task.Run(() => QuickSort(list, pivotIdx, right));
Task.WaitAll(new[] { leftTask, rightTask });
}
}
}
Вопросов:
- Есть лучший способ добиться того же?
- Для целого числа его простого, как перевести свою версию
multi column sort
, как выбор раздела будет дело сложного
Любого указатель, который может установить меня на правильном пути
Вы пробовали PLINQ? –
У меня возникнет соблазн разгрузить это в базу данных некоторого описания для управления индексацией и последующей сортировкой. –
@Ivan вы имеете в виду AsParallel, это работает с динамической сортировкой нескольких столбцов linq, я не пробовал его –