私は現在、タスク並列ライブラリを使用して結果が生成される速度を向上させる小さなシミュレーションユーティリティを開発しています。シミュレーション自体は、CPUを集中的に使用する長いジョブであり、基本的に、さまざまな変数を使用してシミュレーションを実行する数千の小さなジョブで構成されています。
ただし、各タスクで使用されるリソースは、すべてが完了するまで解放されないため、十分な変数が使用されている場合は、メモリリークが発生し、メモリ不足の例外が発生します。各タスクの最後にGCを強制するとリソースが解放されますが、実行するにはすべてのスレッドを中断する必要があるため、シングルスレッドのパフォーマンスに近い結果になると理解しています。
このような長時間の操作中にリソースを解放するにはどうすればよいですか?
この文脈での「リソース」とは、doubleの配列を指します...それらの多くです。
public List<AnalysisTask> Questions; //Each variable combination is added as a Q
//Create a task for each simulation
Task<SimulationResults>[] tasks = new Task<SimulationResults>[Questions.Count];
foreach(var q in Questions)
{
AnalysisTask temp = q
tasks[taskCount] = Task.Factory.StartNew((t) =>
{
var result = EvaluateRules(temp);
if(reults.Value > Leader[0].Value)
Leader[0] = result;
else
{
result.Dispose();
//This releases resources but interrupts threads
//GC.Collect(2, GCCollectionMode.Forced);
return null;
}
return result;
}
}
//Completion task
Task.Factory.ContinueWhenAll(tasks, (ant) =>
{
DoSomethingWithAnswer(Leader[0]);
}
おそらく私はタスクを設定する際に間違ったアプローチを取りましたか?アドバイスや指示に感謝します:)