2

これをより明確にするために、コード サンプルを示します。

$file = fopen('filename.ext', 'rb');

// Assume $pos has been declared
// method 1
fseek($file, $pos);
$parsed = fread($file, 2);

// method 2
while (!feof($file)) {
    $data = fread($file, 1000000);
}

$data = bin2hex($data);
$parsed = substr($data, $pos, 2);

$fclose($file);

メソッド 1 には約 40 個の fread() があります (おそらく 15 個の fseek()) とメソッド 2 には 1 個の fread() があります。合計バイト数 (すべてファイルの中央で比較的接近しています)。

では、どのコードのパフォーマンスが向上するのでしょうか? どのコードを使用するのがより理にかなっていますか? 簡単な説明をいただければ幸いです。

4

3 に答える 3

4

探しているオフセットが既にわかっている場合は、ここでは fseek が最適な方法です。ファイルの数バイトだけが必要な場合は、ファイル全体をメモリにロードする理由がないからです。最初の方法の方が優れています。ファイル ストリーム内の目的の場所までスキップして、小さな部分を読み取るからです。2 番目の方法では、ファイル全体をメモリに読み込み、それをシークする必要がありますが、ファイルから直接読み込むこともできます。これがあなたの質問に答えることを願っています

于 2010-03-02T15:52:30.963 に答える
3

ファイルはクラスター単位で読み取られ、クラスターは通常 8 kb 程度です。通常、いくつかのクラスターが先読みされます。

そのため、ファイルが数 KB しかない場合、ファイル全体を読み取る場合と比較して、fseek を使用しても得られるものはほとんどありません。とにかく、ファイルシステムはファイル全体を読み取ります。

あなたの場合のように、ファイルがかなり大きい場合は、いくつかのクラスターのみを読み取る必要があるため、最初の方法のパフォーマンスが向上するはずです。最悪の場合でも、すべてのデータがディスクから読み取られますが、アプリケーションが使用するメモリは少なくなります。

于 2010-03-02T15:56:07.163 に答える
1

必要な位置を探してから、必要なバイトだけを読み取ることが最善の方法のようです。

しかし、正解は (いつものように) 推測ではなく実際にテストすることです。サーバー環境で 2 つの例を実行し、時間を測定します。また、メモリ使用量も確認してください。次に、バックアップするためのハード データが得られたら、最適化を行います。

于 2010-03-02T16:05:01.233 に答える