データベースからデータを取得しています。それぞれの結果はこんな感じ
ASDF-1234-JKL-F1-STUFF
50,000 件の結果があります。それぞれが爆発している
$exploded = explode('-',$dash_delimited_datum);
// $exploded = array('ASDF','1234','JKL','F1','STUFF');
私はこれを試しました:
$data = array();
while($row = mysql_fetch_array($result) ){
$i++;
if($i > 99999) {
break;
}
$data = array_merge($data,explode('-',$row[0]));
}
しかし、私はそれで5分のサーバータイムアウトに達しました.
そして、これはまったく機能しませんでした:
while($row = mysql_fetch_array($result) ){
$i++;
if($i > 99999) {
break;
}
$data_parts = explode('-',$row[0]);
foreach($data_parts as $value) {
$data = array_push(($data,$value);
}
}
予想外に、これは「わずか」9秒で機能しましたが、さらに高速化できるかどうか疑問に思います。
while($row = mysql_fetch_array($result) ){
$i++;
if($i > 99999) {
break;
}
$data = array_unique(array_merge($data,explode('-',$row[0])));
}
編集: 800 ミリ秒で、最善の解決策と思われる解決策を思いつきました。数字キーを削除するために「閉鎖」(匿名関数) を使用したことに注意してください。しかし、実際には、それを削除すると、スクリプトが 30 秒でタイムアウトしました。
$data=array();
while($row = mysql_fetch_array($result) ){
$i++;
if($i > 99999) {
break;
}
$data_parts = array_flip(array_filter(explode('-',$row[0]),
function($value) {
if(is_numeric($value)) {
return false;
} else return true;
}));
$data = array_merge($data,$data_parts);
}
$data = array_keys($data);
sort($data);
結論:
すべての迅速な回答は、値ではなく配列キーを使用したトリックを使用していました。そして、私の最良の答えと以下の2つの非常に速い答えの違いは、値をメイン配列に直接割り当てるためにforeach
内側を使用しているようです。PHPの関数呼び出しはコストがかかると思われますが、この例は、それが実際に高価であることを証明しているようです。どちらの最良の回答も、300 ミリ秒未満で結果が得られました。私の最良の答えは、数値を除外した場合にのみ高速に機能し、それ以外の場合は 30 秒のサーバー タイムアウトが発生しました。while loop
$data
したがって、大量のデータを処理している場合は、可能な限り関数ではなく構造を使用してください。
(はい、それらが非推奨であることは知っています)mysql関数についての注意 1つの答えは、mysql_fetch_assoc
代わりにmysql_fetch_array
. 実際にmysql_fetch_row
は、「最速」であるはずですが、この変更によって、このデータ セット (約 48,000 件の結果) のページ読み込み速度にまったく違いはありませんでした。も使ってみmysql_result
ました。PHP のドキュメントによると、複数の行を取得するときは遅くなり、はるかに遅くなります。
これは読み込みに 6.27 秒かかりましたが、同様に構造化された最良の回答は約 0.27 秒 (270 ミリ秒) かかりました。
$i=0;
while($data_parts = explode('-',mysql_result($result,$i,0)) ){
$i++;
if($i > 99999) {
break;
}
foreach($data_parts as $value) {
$data[$value] = 1;
}
}
$data = array_keys($data);