0

スレッドを使用して配列内のデータをクランチできるように配列をコピーしようとしましたが、明らかに配列を小さなチャンクに分割することはありません (1 配列 -> 4 四半期 (4 配列) としましょう)。

指定された (int) 開始点からコピーを見つけることができ、最初から最後まですべての先行データをコピーできる唯一の方法です。複数のスレッドを使用してデータを処理している場合、スレッド化のポイントが無効になります。

これは、私がやりたいことを示す擬似コードです。

int array { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }
int split1 { 0, 1, 2, 3 }
int split2 { 4, 5, 6, 7 }
int split3 { 8, 9, 10, 11 }
int split4 { 12, 13, 14, 15 }

または、配列の長さを均等に分割できないとしましょう

int array { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
int split1 { 0, 1, 2, 3 }
int split2 { 4, 5, 6, 7 }
int split3 { 8, 9, 10, 11 }
int split4 { 12, 13, 14, 15, 16}
4

1 に答える 1

2

指定された (int) 開始点からコピーを見つけて、最初から最後まですべての先行データをコピーできる唯一の方法です。これは、複数のスレッドを使用してデータを処理している場合、スレッド化のポイントを無効にします。

それがどの方法であったかを示していないのは残念です。配列の一部を別の配列にArray.Copyコピーするためのさまざまなオーバーロードがあります。これはおそらく最も役立つでしょう:

public static void Copy(
    Array sourceArray,
    int sourceIndex,
    Array destinationArray,
    int destinationIndex,
    int length
)

または、基本的に同じ署名を持つを見てください。Buffer.BlockCopyただし、値はすべて、配列インデックスではなくバイト単位です。また、プリミティブの配列でのみ機能します。

もう 1 つの方法は、配列のコピーをまったく作成しないことです。各スレッドが、配列のどのセグメントを処理する必要があるかを知っていれば、そのセグメントに直接アクセスできます。Parallel.ForEachまた、操作をより高いレベルで簡単に並列化する方法として (および同様の方法) を検討する必要があります。

于 2012-12-23T13:29:59.613 に答える