在单独的行上使用fseek()fread()或者fread()整个文件和substr来解析是否更好?

时间:2010-03-02 15:44:46

标签: php optimization performance fread

为了更清楚,我将把代码示例:

$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()。我唯一想知道的是,当你真的只是加载1000000字节时是否过度杀伤提取总共100个字节(在文件中间相对靠近)。

那么哪些代码的表现会更好?使用哪种代码更有意义?非常感谢快速解释。

3 个答案:

答案 0 :(得分:4)

如果您已经知道要查找的偏移量,那么fseek是最好的方法,因为如果您只需要几个字节,就没有理由将整个文件加载到内存中。第一种方法更好,因为您可以直接跳到文件流中的所需内容并读出一小部分。第二种方法要求您将整个文件读入内存,然后在您可以直接从文件中读取它的同时进行搜索。希望这能回答你的问题

答案 1 :(得分:3)

文件以群集为单位读取,群集通常类似于8 kb。通常会提前阅读一些群集。

因此,如果文件只有几kb,那么与阅读整个文件相比,使用fseek几乎没有什么收获。无论如何,文件系统将读取整个文件。

如果文件相当大,就像你的情况一样,只需要读取一些簇,所以第一种方法应该更好。在最坏的情况下,仍然会从磁盘读取所有数据,但您的应用程序仍将使用更少的内存。

答案 2 :(得分:1)

似乎寻找你想要的位置,然后只读取你需要的字节是最好的方法。

正确的答案是(一如既往)将其测试为真实而非猜测。在服务器环境中运行两个示例并进行一些时间测量。还要检查内存使用情况然后在获得一些硬数据进行备份后进行优化。