並列でスレッドセーフな計算と並列を組み合わせるパターンはありますか?
最初のステップが並列の恩恵を受ける結果を計算する必要があり、2 番目のステップは並列の結果に対するシリアル プロセスです。
1 つのオプションは、並行して実行し、出力をコレクションに保存してから、コレクションを順次処理することです。コレクションが非常に大きくなる可能性があるため、メモリ管理に問題があります。
以下はシリアル版です。基本的に、TableQueryGetRowKeys を並列化し、その結果をスレッド セーフな方法で使用したいと考えています。for を並列化し、最終結果をロックしようとしましたが、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;