web-dev-qa-db-ja.com

N行を読み取り、条件付きで更新します。ここで、DNAシーケンス処理の場合はN> 100,000

Azureテーブルを使用してDNAシーケンスを「何か」に関連付ける概念実証アプリケーションがあります。

表1はマスターテーブルです。すべてのDNA配列を一意にリストします。 PKは、RKの負荷分散されたハッシュです。 RKは、DNA配列の一意のエンコードされた値です。

サブジェクトごとに追加のテーブルが作成されます。 PKは負荷分散されたハッシュであり、RKはDNA配列の一意の値です。ここでのRKの数は、マスターテーブルよりも桁違いに小さいと想定します。各サブジェクトには、マスターテーブルに1つの参照があるN個のDNAシーケンスのリストがあります。ここで、Nは> 100,000です。

多くのテーブルが同じDNAシーケンスを参照する可能性がありますが、この場合、マスターテーブルには1つのエントリしか存在しません。

私のAzureのジレンマ:

データを操作するときに、マスターテーブルの参照をロックする必要があります。タイムアウトを処理し、1つのC#スレッドが情報を処理しているときに、他のスレッドがデータを上書きしないようにする必要があります。他のスレッドは、これがロックされていることを認識し、他のロックされていないレコードに移動して作業を行う必要があります。

理想的には、計算がどのように進んでいるかについての進捗レポートを取得し、プロセスをキャンセルする(そしてロックを解除する)オプションが必要です。

質問

これに対する最善のアプローチは何ですか?

私はインスピレーションを得るためにこれらのコードスニペットを見ています:

http://blogs.msdn.com/b/jimoneil/archive/2010/10/05/Azure-home-part-7-asynchronous-table-storage-pagination.aspx

https://stackoverflow.com/q/4535740/328397

4

私はAzureを使用していませんが、オンプレミスのSQL Serverのみを使用していますが、これは実際には非同期データアクセス/同時実行の問題のようです。

各スレッドに、処理しているデータのセットを一元化された場所(別のテーブルなど)で追跡させてはどうでしょうか。その後、後続のスレッドは、別のスレッドにすでに「チェックアウト」されているレコードを無視できます。スレッドが「チェックアウト」したデータの処理が終了すると、中央の場所からレコードが削除されます。

また、レコードが「チェックアウト」されたときのUTCタイムスタンプを含めることができます。これにより、何かが失敗したりタイムアウトしたりした場合に、「チェックアウト」レコード(つまりロック)を次のスレッドでクリアできます。別の労働者プロセスでさえ。

1
Alexander