3

別のデータストアで開始されたいくつかの顧客データがあります。標準化してコア DB に移行するための統合スクリプトがあります。約 60,000 ~ 70,000 のレコードが移行されています。

当然、ちょっとしたバグがあり、9k行目あたりで失敗しました。
次の秘訣は、スクリプトが再度実行されたときに中断したところから再開できるようにすることです。


参考までに:
ソース レコードはかなり厄介で、購入したブランドによって 5 つのテーブルに分割されています ... IE:

create TABLE `brand1_custs` (`id` int(9), `company_name` varchar(112), etc...)
create TABLE `brand2_custs` (`id` int(9), `company_name` varchar(112), etc...)

もちろん、特定の会社名は複数のソース テーブルに存在する可能性があります (実際に存在します)。


とにかく...ログにParseCSVライブラリを使用しました。移行に成功すると、各行がログに記録されます(プログラムで解析するには醜すぎる場合、一部の行はスキップされます)。ログを ParseCSV で開くと、次のようになります。

array(
  0 => array( 'row_id'   =>  '1', 
          'company_name' =>  'Cust A', 
          'blah'         =>  'blah', 
          'source_tbl'   =>  'brand1_cust'
      ),
  1 => array( 'row_id'   =>  '2',
          'company_name' =>  'customer B',
          'blah'         =>  'blah',
          'source_tbl'   =>  'brand1_cust'
      ),
  2 => array( 'row_id'   =>  '1',
          'company_name' =>  'Cust A',
          'blah'         =>  'blah',
          'source_tbl'   =>  'brand2_cust'
      ),
  etc...
)


私の現在のワークフローは次のようなものです。

foreach( $source_table AS $src){
    $results = // get all rows from $src
    foreach($results AS $row){
        // heavy lifting
    {
}


私の計画は、 andの組み合わせ に一致するものがあるかどうか、
$row->idandの$src->tbl組み合わせをチェックすることです。

$log[?x?]['row_id']$log[?x?]['source_tbl']

これを実現するには、foreach($log AS $xyz)ループforeach($results AS $row)ループを実行し、既に移行されていることがわかっている行をスキップする必要があります (そうしないと、重複してしまいます)。
それは私にはたくさんのループのようです。
記録が 4 万または 5 万位になったときはどうでしょうか。
それは 50k x 50k ループになります!!

質問:毎回ループする以外
、サブ配列に "row_id" と "source_tbl" の一致があるかどうかを確認するより良い方法はありますか?


注:いつものように、これについてまったく別の方法で考える必要がある場合は、あらゆる提案を受け入れます :)

4

1 に答える 1

0

ハッシュ(または合成キー)を行うログに対して前処理を行い、row_id and source_tblそれをハッシュマップに保存してから、各行に対してキーのハッシュを構築し、ハッシュマップで既に定義されているかどうかを確認する必要があると思います。

時間をかけて検索できるため、ハッシュセットを使用するように言っていますO(k)。そうしないと、よりクリーンなコードになることだけを提案していることと同じになります。

于 2013-03-27T16:30:33.230 に答える