私は大規模なデータセットを処理し、Parallel.ForEach
のレコードを処理し、その結果をConcurrentQueue<List<string>>
に格納しています。レコードが処理され、レコードの各フィールドは文字列になり、その後List
に追加されます。レコードの末尾にList
がある場合は、Enqueued
であり、さらに処理されたすべてのレコードを保持しているConcurrentQueue
で処理が行われます。大規模な不確定データセットのスケーラブルなコレクション
セットを処理してから、私のCPU使用量が新しい波からかなり高くなっていることがわかりました。レコードグループを処理する時間が増え始めました。
ここで私の前提は、List
の容量が満たされてから、新しい大きなList
にコピーされるということです。この容量に追いつくために必要なCPUのサイズが大きくなるにつれて、初期化サイクルが長くなります。私が扱っているデータセットは不確定なサイズで、各レコードにはさまざまな数の子レコードがあります。親レコードの数は通常500kの領域にあります。
私の最初の考えは、List
を親レコードのCount
に初期化することです。 List
はまだ子レコードのために成長する必要がありますが、少なくともそれ以上の時間は成長する必要があります。しかし、より良いスケールのList
には、いくつかのコレクションがありますか?あるいは、私の最初の本能とは違うアプローチが良いでしょうか?
ConcurrentQueueを知っておくとよいでしょう。私は文字列そのものについてヒントを調べます(これはコードベースで、今は苦労しています)。フィールド数はレコード間で静的なので、リストの容量の設定は間違いなく可能です。 – bcwiniger
その場合は、リストの代わりにレコードごとに配列を使用します(少し速くなります) –