あなたが私に耐えてくれることを願っています。できるだけ多くの情報を提供したかったのです。主な問題は、値をポップし、それを使用して1つの大きなフラットファイルを処理し、ファイル全体が処理されるまで何度も繰り返し実行する複数のスレッドで使用される構造(スタックなど)を作成する方法です。ファイルに、2.000行のチャンクを使用して5つのスレッドで処理できる100.000のレコードがある場合、各スレッドは10のチャンクを処理します。
私の目標は、フラットファイル内のデータを移動することです(ヘッダー...サブヘッダー...詳細、詳細、詳細、...詳細、サブフッター、サブヘッダー...詳細、詳細、詳細、...詳細、サブフッター、 Subheader ... Detail、Detail、Detail、... Detail、SubFooter、Footer structure)をOLTP DBに入れ、シンプル(フルの可能性あり)から3つのテーブルにリカバリモードを設定します。1つ目はサブヘッダー行に存在するサブヘッダーの一意のキーを表し、2つ目は中間テーブルSubheaderGroupは、2000レコードのチャンクで詳細行のグループ化を表します(FKとしてサブヘッダーのID PKを持ち、3番目はサブヘッダーPKを指すFKを持つ詳細行を表す必要があります。
何万もの詳細行を持つことができ、ロード中に宛先テーブルで0に設定された特別なフィールドを使用し、ファイル処理の最後にこれを変更するトランザクションの更新を行っているため、手動のトランザクション管理を行っています。値を1にすると、ロードが終了したことを他のアプリケーションに通知できます。
このフラットファイルを、複数のスレッドで処理し、宛先テーブルのメタデータから作成されたIDataReaderを使用してSqlBulkCopyを使用してインポートできる、複数の等しい部分(同じ行数)に分割したいと思います。
SqlBulkCopyOptions.TableLockオプションを指定してSqlBulkCopyを使用するには、プロデューサー/コンシューマーパターン(以下のリンクで説明されている-pdf分析とコードサンプル)を使用したいと思います。 http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx このパターンにより、複数のプロデューサーを作成でき、同じ数のコンシューマーが行を消費するためにプロデューサーにサブスクライブする必要があります。
TestSqlBulkCopyプロジェクトのDataProducer.csファイルには、数千のレコードの生成をシミュレートするメソッドがあります。
public void Produce (DataConsumer consumer, int numberOfRows) {
int bufferSize = 100000;
int numberOfBuffers = numberOfRows / bufferSize;
for (int bufferNumber = 0; bufferNumber < numberOfBuffers; bufferNumber++) {
DataTable buffer = consumer.GetBufferDataTable ();
for (int rowNumber = 0; rowNumber < bufferSize; rowNumber++) {
object[] values = GetRandomRow (consumer);
buffer.Rows.Add (values);
}
consumer.AddBufferDataTable (buffer);
}
}
このメソッドは、新しいスレッドのコンテキストで実行されます。この新しいスレッドが元のフラットファイルの一意のチャンクのみを読み取るようにし、別のスレッドが次のチャンクを処理するようにします。次に、コンシューマーは、SqlBulkCopy ADO.NETクラスを使用して、データ(ポンプされたデータ)をSQLServerDBに移動します。
したがって、ここでの質問は、各スレッドでどのlineFromからlineToを処理するかを指示するメインプログラムに関するものであり、これはスレッドの作成中に発生するはずだと思います。2番目の解決策は、おそらくスレッドがいくつかの構造を共有し、それらに固有の何か(スレッド番号やシーケンス番号など)を使用して共有構造を検索し(おそらくスタックと値をポップする(実行中にスタックをロックする)、次のスレッドが次に、次の値を取得します。メインプログラムはフラットファイルを取得し、チャンクのサイズを決定してスタックを作成します。
それで、誰かがいくつかのコードスニペット、複数のスレッドが1つのファイルを処理し、そのファイルの一意の部分のみを取得する方法に関する疑似コードを提供できますか?
ありがとう、ラッド