dポイントプレゼントキャンペーン実施中!

質問させて頂きます。

フレームワークにcakePHP、DBにMySQLを使用して開発をしております。
バルクインサートする際にメモリが足りず処理を行なうことが出来ません。
何か参考になる方法があれば教えて頂けると幸いです。


今回10万件ほどの大量のランダム文字列(ユニークを期待)データをPHP側で作成して、そのデータをバルクインサートを使用して保存したいと考えております。
※この時点でユニークのチェックをしているわけではないので、必ずしもユニークなデータとは限りません。

また、データ投入方法として、データの重複を避けるため、「INSERT IGNORE INTO」を使用しております。

cakePHPのsave()を使用して、「INSERT IGNORE INTO」を設定する方法が分からなかったため、
query()を使用して、直接SQLを記述しております。
また、SQLを直接記述するためサニタイズも行っております。

具体的には
-----------------------------------------------------------------
// (?, ?)の部分はimplode()を使用してデータ件数分記述します。
$sql = "INSERT IGNORE INTO random_code_table ( random_code, created) VALUES (?, ?),(?, ?),(?, ?),…(?, ?)";
// $random_code_list配列に10万件のランダム文字列データを格納しています。
foreach ($random_code_list as $code) {
$params[] = $code;
$params[] = date('Y-m-d H:i:s');
}
$this->query($sql, $params, false );
-----------------------------------------------------------------

上記の記述にして、1万件のデータを投入した場合、1件ずつ追加していた時よりも数段早く処理速度を上げることが出来ました。
しかし、10万件のデータを投入した場合、下記のようなPHPエラーが出て、処理がSTOPしてしまいます。
「Error: Fatal Error (1): Allowed memory size of 268435456 bytes exhausted (tried to allocate 1000084 bytes)…」


自分なりに解決方法は無いかと調べてみたのですが、php.iniでメモリの上限を上げるといった方法しか見つけることが出来ず、こちらに質問させて頂きました。

理解不足の部分もあり、質問内容に不備な点があるかもしれませんが、少しでもヒントになるようなことがあれば教えて頂けると幸いです。

ご存じの方がいらっしゃいましたら、よろしくお願いいたします。

A 回答 (1件)

メモリが足りないと言っているのですから、メモリを消費しないようにコードを書き換えるべきです。


というか、10万件をいっぺんに登録しようとしているところに問題があるように思います。
データを1万件ずつに分けて登録してみたらどうでしょうか。

あるいは、SQL でデータ重複をはじくのではなく PHP のほうで array_unique() を使って重複を除去したうえで save() するとか。
http://www.php.net/manual/ja/function.array-uniq …
    • good
    • 0
この回答へのお礼

回答頂いた通り、1万件ずつに分けて登録を行なうようにしました。
ありがとうございます!

お礼日時:2014/03/19 15:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!