對於List<T>
,我需要實現多列排序,其中列名和排序方向在運行時已知。我使用的是System.Linq.Dynamic OrderBy
API,它可以採取列名和排序方向連接字符串,因此下面的代碼工作:多列並列排序列表<T>
List<T> data = DataCollection; // Stored in Cache
var sortedData = data.OrderBy("Col1 asc, Col2 desc, Col3 asc,Col4 asc");
挑戰時的數據增加1 million+
記錄的大小,那麼同樣的排序操作減慢顯着,就像沒有魔杖一樣。
現在我想了解在Parallel
模式下是否有相同操作的方法。以下是選項,我正在考慮:
選項1:
- 劃分數據收集在較小的子集,例如100 K均和運行在每個排序,但隨後面臨的挑戰是如何合併個人組,在我的理解有沒有方便的機制整合有序子集
選項2
因爲我是覓食的選項,遇到下列並行模式來抓List<int>
,其中遞歸併行排序也要求遞歸序列排序內部:
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動態多列排序工作,我還沒有嘗試過 –