1

fgets()大きなファイルに対して非常に恐ろしい実装についてはどうfreadですか?

実証するには、次のコードを実行します。

<?php
$line = str_repeat('HelloWorld', 100000) . "\n";
for($i=0; $i<10000; ++$i)
    file_put_contents('myfile', $line, FILE_APPEND);
//now we have roughly a 1gig file

// We'll even let fread go first incase
// the subsequent test would have any caching benefits
$fp = fopen('myfile2','r');
$start = microtime(true);
while (fread($fp,4096));
$end = microtime(true);
print ($end-$start) . " using fread\n";
fseek($fp, 0);

$start = microtime(true);
while (fgets($fp));
$end = microtime(true);
print ($end-$start) . " using fgets\n";
?>
4

1 に答える 1

5

呼び方に関係があるのか​​もしれませんfgets。マニュアルによると、2 番目のパラメーターを省略すると、次のようになります。

長さが指定されていない場合、行の終わりに達するまでストリームから読み取り続けます。

扱うデータに非常に長い行がある場合 (例: "HelloWorld" 100,000 回 = 1,000,000 文字)、そのすべてを読み取る必要があります。

再び、マニュアルから:

ファイル内の大部分の行がすべて 8KB より大きい場合は、スクリプトで行の最大長を指定する方がリソース効率が高くなります。

于 2008-10-28T02:36:56.483 に答える