2016-08-02 5 views
0

私はmysqlからレコードを引き出すためにwhileループを使用しています。これは、事故でジャッキアップされたログをリセットするためです。そのため、DBのバックアップからIDとタイムスタンプを取り出し、これらの値で本番表を更新することで、以前のレコードを修正しています。PHPのメモリ使用中whileループ

このログテーブルには12,545,628個のレコードがあるため、メモリ使用量を制限し、このソリューションの使用を制限したいと考えていました。 IDとタイムスタンプのフィールドだけを引っ張って、1GBのメモリをすばやくバストします。

これは、一度に1つのレコードにメモリ使用量を制限しているのですか、それともすべてのIDとタイムスタンプをまっすぐに引き出し、

(PDOは奇妙に見えるかもしれませんので、私は、データベースクラスの設定をしました)

$sql = 'SELECT id, timestamp FROM log_people WHERE 1'; 
$Test->sqlQuery($sql); 

while ($testdb = $Test->sth->fetch(PDO::FETCH_ASSOC)) { 
    $Prod->beginTransaction(); 

    try { 
     $sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id']; 
     $Prod->sqlQuery($sql2); 


    } catch (exception $err) { 
     $Prod->rollback(); 
     echo $err->getMessage(); 
    } 
} 

は私だけ一度に一つのレコードを引っ張って変更するには、以下のコードを実行されるべきか?あなたの問題で

while ($count < 12545628){ 
    $sql = 'SELECT id, timestamp FROM log_people WHERE id ='.$count; 
    $Test->sqlQuery($sql); 
    $testdb = $Test->sth->fetch(PDO::FETCH_ASSOC) 

$Prod->beginTransaction(); 

try { 
    $sql2 = 'UPDATE log_people SET timestamp = "'.$testdb['timestamp'].'" WHERE id = '.$testdb['id']; 
    $Prod->sqlQuery($sql2); 
    $count++; 


} catch (exception $err) { 
     $Prod->rollback(); 
     //return $err->getMessage(); 
     echo $err->getMessage(); 
    } 

}

+1

なぜ、すべてのレコードを「選択」する必要があるのですか?すべてのレコードを更新する必要がある場合 - なぜそれらを選択するのですか? –

+1

バックアップテーブルのコピーを同じDBに置き、SQLを使用して本番テーブルを更新することで、これをずっと簡単に行うことはできませんでしたか?なぜPHPでそれをするのですか? –

答えて

0

、あなたは同じ、以前の値を使用してテーブルを更新しています。メモリに関しては、phpのメモリ制限はphp.iniまたはPHPコードで定義することができます。また、2番目のコードは、最初のものに比べてメモリ効率が良いですが、各IDごとに別々のクエリがあるため時間がかかります。

0

これらのレコードを更新するときにすべてのレコードを選択する必要がある理由もわかりません。 とにかくメモリの使い方を助けるヒントがいくつかあります。
ファーストポイントスクリプトにメモリ不足がどこにあるかを示す関数があり、この関数を使用して確認できますmemory_get_peak_usage();
第2点また、ヌルをバールに再割り当てすることもできます。 unset();関数は、ガベージコレクタがそのラウンドを実行しているときから、unset()を実行するまで便利です。関数は単にデータへの変数参照を破壊するだけで、データはメモリにまだ残っていて、PHPはもはやポインタを持っていなくてもメモリが使用中であるとみなします。解決策:ガベージコレクタがそれを保持するまで、変数にnullを代入してデータをクリアします。 $ var = null; unset()を使用することもできます。変数ポインタの設定を解除するために、しかし、メモリ使用量にほとんど差は、私が見ることができる限り、そこにある:

unset($var); 


サードポイントあなたがオブジェクトを廃棄する時に、あなたのオブジェクト参照を破壊することによってそれを行うことができます別の方法。

protected function __distruct() 
{ 
    $this-&gt;childObject = null; 
}