性格いい人が優勝

PHPとMySQLで100万件のデータを登録する方法に困っております。

1.PHPで100万回ループして数字をランダムで取得し一意の数字を配列に格納。
⇒データ量が多すぎてタイムアウトしてしまいます。いい方法はありますか?

while($i<1000000){
$h = sprintf("%07d",mt_rand(1,1000000));
if(!array_search($h,$val)){
    array_push($val,$h);
    $i++;
}
}

2.またデータベースはMySQLを使用しようかと考えていますが、一気に登録する方法など効率のいいやり方はありますでしょうか?

A 回答 (5件)

MySQLのバージョンにもよるでしょうけど、MySQL側の処理でやれば


100万件のデータくらいはすんなり作れそうですけどねぇ・・・

たとえば、hogeというテーブルにデータが1つ入っている状態から

INSERT INTO hoge SELECT * FROM `hoge`

を19回やれば100万件のデータになりますよね?
その後必要なフィールドに対して

UPDATE hoge SET data=RAND()

的なことをやれば、できあがり
    • good
    • 0
この回答へのお礼

回答ありがとう御座います。返信遅くなり申し訳ございません。
質問の補足になってしまいますが、MySQLのRAND関数を使用してデータを登録しようと思ったのですが、重複するデータがあるとだめなんです。

お礼日時:2009/02/19 23:22

#2です。



プライマリーかユニークが設定されているということであれば
そのキーにRAND()をつかうか、オートインクリメントならNULLをいれる
もしくは変数をつかってインクリメントするなど、いくらでもやりようがあるかと。
    • good
    • 0
この回答へのお礼

ありがとうございます。
解決しました。
テスト環境のスペックが悪すぎてタイムアウトしていました。

お礼日時:2009/02/25 00:36

結局やりたいのは、1~100万までの数字をランダムに並び替えたモノをMySQLに入れるってコトですよね?



なら、まずは普通に1から100万までをそのまま配列にいれましょう。
for($i=1;$i<=1000000;$i++){
$array[] = $i;
}

で、それをランダムに並べ替え。
shuffle($array);

あとはMySQLに流し込みましょう。
foreach($array as $value){
$values .= ",('".$value."')";
}
$sql = "insert `TABLE`(`カラム`) values".substr($values,1);

普通この程度のことなら10秒もかからないと思うけど、環境によってset_time_limit() で時間を延ばすなりすればいいかも。
あとは、MySQLに流し込むのに1万件ごとにやるとかね。
    • good
    • 0
この回答へのお礼

ありがとうございます。
環境が悪くて遅かったみたいです。
20秒くらいでinsertできました。

お礼日時:2009/02/25 00:35

phpの処理でこけてるのか、mysqlに突っ込むところでこけてるのか


定かではありませんが、「MySQLを使用しようと」ということは、
phpの処理でこけてるのでしょうか?
7桁のデータ100万件なので、たかだか7MB分なので、メモリがあふれるってことはないでしょうけど・・
となると、アレイに一気にためこむのではなく、都度ファイルに書き出していって、memphisさんのおっしゃるように、mysqlには、LOAD DATAで突っ込むのが早いしいいかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとう御座います。返信遅くなり申し訳ございません。
PHPで実行してprint_rで配列を表示しているだけなのですが、処理が多すぎてapacheでタイムアウトしてしまいます。
apacheのタイムアウト時間を延ばしても延々と処理が続いてしまっている状況です。
MySQLに取り込むのはLOAD DATAを使用することにします。

お礼日時:2009/02/19 23:27

登録するデータを別ファイルにしてLOAD DATAで登録するとか、


一定数ごとにリロードしてタイムアウトにならないようにする等
    • good
    • 0
この回答へのお礼

回答ありがとう御座います。返信遅くなり申し訳ございません。
PHPにてファイルを作成しLOAD DATAで登録しようと思います。
PHPで一定数ごとにリロードして処理を続けることは可能なのでしょうか?

お礼日時:2009/02/19 23:18

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