1

大きなファイル ハンドラーを実装する必要があるアプリケーションを PHP で開発しています。ファイルの読み書きは問題ありませんが、ファイルの内容を確認するのは問題です。

変数が同じドキュメントで既に使用されているかどうかをチェックする再帰関数を作成しました。

private function val_id($id){
    if(!isset($this->id)){
            $this->id = array();
        }
    if(in_array($id, $this->id)){
        return $this->val_id($id+1);
    }else{
        $this->id[] = $id;
        return $id;
    }
}

in_array($id,$this->id) が FALSE を返す場合、$id は $this->id (使用されたすべての ID を含む配列) に追加され、有効な ID を返します。

これが TRUE を返す場合、パラメータ $id+1 を持つ同じ関数を返します

一度に 300000 を超えるレコードについて話しているので、PHP はそのような大きな配列を格納できません。この配列が大きくなりすぎると、生成するドキュメントに行を書き込むのをやめるようです。しかし、私はそのようなエラーメッセージを受け取りません。

生成されたドキュメントは複数の行 INSERT を持つ SQL ファイルであるため、別の解決策として、ID がデータベースに既に存在するかどうかを確認することができます。MySQL はこれらの例外をキャッチし、ID に 1 を追加してこれらのエントリを再試行できますか? どのように?

この問題をどのように解決する必要があると思いますか?

敬具、

ウーター

4

3 に答える 3

1
  1. エラーメッセージが表示されるようにします。
  2. 増加memory_limit
  3. isset($array[$this->id])値の代わりにパラメーターをキーに保存します-したがって、代わりに使用できますin_array()
于 2013-01-15T15:19:18.100 に答える
1

INSERT IGNOREを使用して、mysql で重複キー チェックを無効にし、php でキー チェックを削除します。ステートメントは次のようになります。

INSERT IGNORE INTO tbl_name SET key1 = 1, col1 = 'value1'

ID に常に 1 を追加したい場合は、ON DUPLICATE KEYを使用してキーを 1 つ増やします。

INSERT INTO table (a,b,c) VALUES (1,2,3)
    ON DUPLICATE KEY UPDATE c=c+1;
于 2013-01-15T15:20:33.117 に答える
0

なぜ 30.000 レコードが問題になるのでしょうか? 標準の PHP 配列の各レコードは 144 バイトで、30.000 は 4218,75 kByte を意味します。大きな問題ではない。

それ以外の場合は、配列キーを使用した Your Common Sense のアイデアは、より高速であるため、検討する価値があります。

于 2013-01-15T15:27:11.157 に答える