2

プロット データを含むファイルがあります。各行には合計 4 つの座標があり、データ ファイルは 1 GB を超える場合があります。たとえば、データ ファイルの 3 番目の列を取得したいのですが、どの方法が良い方法であり、はるかに高速であると考える必要がありますか?

実行の使用:

exec("awk '{ print $3 }' data", $output);

PHP スクリプトの使用:

$data = file("data");
$points = array();
foreach($data as $line)
    $points[] = $line[2];

さらに、サーバーは大きなファイルの読み取りを許可していないため、fread を使用してファイルをいくつかの部分に分けて読み取る必要があります。しかし、fread は十分にスマートではなく、各部分の最後の行を結合するためにいくつかの作業を行う必要があります。PHPでファイルの列を読み取るための提案またはより良い方法はありますか?

4

2 に答える 2

3

以下/fileは 3.1 GB の大きなファイルです。

root# time awk '{ print $3 }' /file >/dev/null

real   1m42.430s
user   1m0.241s
sys    0m2.198s

わかった。awkで±1.7分。PHP をテストしてみましょう (フィールド分割なし、3 番目の文字のみ):

root# time php -r '$fp = fopen("/file", "r"); while (($buf = fgets($fp)) !== false) echo $buf[2]; fclose($fp);' >/dev/null

real   4m17.322s
user   3m16.571s
sys    0m31.625s

PHPで±4.3分!@Jack のコードを使用すると、どれくらいの時間がかかるか想像したくありません...

PHP は よりもはるかに遅いですawk。非常に大きなファイルでは、awk を使用します (exec() によって呼び出されます)。ここでわかるように、PHP はユーザー空間で多くの時間を費やします (awk の 3 倍)。

于 2013-07-22T09:13:03.880 に答える