是否存在將並行和並行線程安全計算組合的模式?並行和線程安全串行模式
需要計算第一步將從並行中受益的結果,第二步是對並行結果的串行處理。
一種選擇是運行並行並將輸出保存到集合,然後對集合進行連續處理,然後運行。由於集合可能非常大,因此存在內存管理問題。
以下是系列版本。基本上我想平行TableQueryGetRowKeys並以線程安全的方式使用該結果。試圖只是平行的並鎖定最終結果,但rowKeys可能會關閉。嘗試聚合,但我想不出如何將集合傳遞給聚合,更不用說在聚合中執行線程安全相交。
IEnumerable<string> finalResults = null;
if (partitionKey.Length == 0) return finalResults;
object lockObject = new object();
finalResults = TableQueryGetRowKeys(partitionKey[0], 0);
HashSet<string> rowKeys;
for(int i = 1; i < partitionKey.Length; i++)
{
// IO operation to Azure Table Storage against the PartitionKey
// so very amenable to parallel
rowKeys = TableQueryGetRowKeys(partitionKey[i]);
// a memory and CPU operation
// this should be much faster than TableQueryGetRowKeys
// going parallel and wrapping this in a lock did not properly synch rowKeys
finalResults = finalResults.Intersect(rowKeys);
}
return finalResults;
你能更詳細地描述你的問題嗎?如在,你如何處理你的數據? – Wug 2012-07-06 17:00:50
在此代碼中TableQueryGetRowKeys只是一個虛擬例程。在現實生活中,它將是對PartitionKey上的Azure表存儲的查詢並返回RowKeys。 Interset將獲得RowKeys公共集合中的一組PartitionKeys。 – Paparazzi 2012-07-06 19:31:52