0

データベースからデータを取得しています。それぞれの結果はこんな感じ

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);
4

3 に答える 3

1

これはどうですか(カウンターを削除しましたが、必要に応じて追加できます):

$data = array();
$i = 0;

while($row = mysql_fetch_array($result) )
{
    $data_parts = explode('-',$row[0]);

    foreach($data_parts as $value)
    {
        if (!isset($data[$value]))
            $data[$value] = $i++;
    }
}

$data = array_flip($data);

私のコンピューターでは実際にベンチマークを実行できないため、実装よりも遅い場合はお知らせください。

于 2013-05-29T07:33:56.110 に答える