2012-04-15 13 views
0

私が続ける前に、これは純粋に直感の問題です。つまり、PHP/MySQLコードで特定のバグを解決するための答えを探しているわけではありません。むしろ、問題を解決するために考えなければならない可能性のある問題の範囲を理解したい。これらの目的のために、コードを投稿したりスクリプトを添付したりすることはしません。私が何をしたのか、何が起こっているのかを簡単に説明します。MySQLは成功した挿入クエリをすべて挿入していません...なぜですか?

私は

  1. は、MySQLデータベースのテーブルに挿入されるXレコードのCSVテキストファイルおよび/または更新の重複エントリ適用を読み取るPHPスクリプトを書かれています。
  2. 私はそのデータセットの "ルート"テーブルと呼ぶレコードにそのレコードを挿入します。
  3. 「ルート」テーブルから特定のフィールドのサブセットレコードを選択し、それらのレコードを「マスター」テーブルに挿入します。
  4. 配布のためにマスタテーブルから出力エクスポートテキストファイルを作成します。

私は30分ごとに別々の予定されたcronタスクを介して処理しているCSVファイルがいくつかあります。すべての情報源から、ファイルからルートテーブルへの推定トランザクションは420,000回、スケジュールされたタスクによるルートテーブルからマスタテーブルへのトランザクションは420,000回挿入されています。

タスクの1つに、約400,000レコードのCSVファイルが単独で含まれています。この処理にはエラーはありませんが、ここでは問題があります:MySQLが示している40万レコードのうち、ルートテーブルに正常に挿入されたレコードは約92,000個だけが実際にルートテーブルに格納されます。仕事。

他のスケジュールされたタスクは、それぞれ約16,000トランザクションと1,000トランザクションを処理し、これらのトランザクションは完全に処理されます。実際に、トランザクションの数を400,000から10,000などに減らすと、これらの処理もうまく処理されます。明らかに、それはここでの目標ではありません。この問題に対処するには

、私はいくつかの救済策を試してみました...

  1. 私のサーバーのメモリを増額(およびphp.iniファイルで最大の上限を増やす)
  2. と専用のデータベースを取得します普通INSERTステートメントとは対照的に、ラン
  3. 使用INSERT上のプロセスは、MySQL文(遅延メモリ)は、実質的にメモリと処理fgetcsvを(ダウン吸う格納された配列を排除するために自分のコードを書き換え
  4. (共有VPSデータベースとは対照的に)拡張)

...これらの救済策はどれも希望どおりに機能していません。

これまでに取られた措置がうまくいかなかったため、この時点でどのような是正措置を検討すべきでしょうか?ありがとう...

+0

ステップ1:郵便番号 –

答えて

0

csvのソースデータに重複レコードが含まれている可能性があります。 csvに400,000レコードがあるにもかかわらず、あなたの 'insert or update'ロジックはそれらを縮小セットにトリムします。メモリが少なくなると例外などが発生する可能性がありますが、この種のデータが消失します。

0

CSVファイルに問題があると思われます。

私の提案: CSVから読み取った各ラインについての情報をデバッグするための

  • 印刷何か。これにより、処理される線の数が表示されます。すべての挿入/更新で
  • 、(もしあれば)すべてのエラーを印刷

それはこのようなものです:エラーがある場合、あなたはそれを見ると、問題を見つけることができます、だから、

<?php 
$csv = fopen('sample.csv', 'r'); $line = 1; 
while (($item = fgetcsv($csv)) !== false) { 
    echo 'Line ' . $line++ . '... '; 

    $sql = ''; // your SQL query 
    mysql_query($sql); 
    $error = mysql_error(); 

    if ($error == '') { 
     echo 'OK' . PHP_EOL; 
    } else { 
     echo 'FAILED' . PHP_EOL . $error . PHP_EOL; 
    } 
} 

(CSVのどのラインに問題があるか)。

関連する問題