有没有更有效的方法来处理二进制文件?

时间:2012-04-23 01:44:06

标签: php

我有一个脚本,它使用如下所示的文件指针对二进制文件执行大量freadfseek调用:

$fp = fopen('r','mybinaryfile');

该脚本处理二进制文件中大约2,500个单独的文件,每个文件都会吸引大量fseekfread个调用,因此对文件指针的总操作可能会超过20,000个。

我是否正确地认为使用我的$fp文件指针进行的每次调用都会导致磁盘上的物理读取操作?

如果是这样,我想知道将整个文件加载到内存中是否更好,并且可以像这样工作。会吗?

目前,当我运行此脚本时,大约需要20秒。在我看来,还有改进的余地。

编辑:而且,如果有可能将文件带入内存,那么如何实现,同时坚持使用指针方法?这些文件每个只有3MB左右,因此内存耗尽应该不是问题。

3 个答案:

答案 0 :(得分:1)

  

我是否正确地认为每个调用都使用我的$ fp文件   指针导致磁盘上的物理读取操作?

不,不一定。操作系统会将文件缓冲到内存中,因此读写操作不必立即打到磁盘上。操作系统也非常擅长这样做。

这是一种将整个文件读入内存并仍然可以使用文件流对其进行操作的方法。

$content = file_get_contents('large_file.bin');
$membuf = fopen("php://memory", "w+b");
fputs($membuf, $content);
unset($content);
rewind($membuf);

// now you can read and seek on $membuf using the usual stream functions fseek, fread etc

答案 1 :(得分:0)

将整个文件作为字符串或数组读入变量,将其存储在内存中。做任何你想做的事,然后把它写回来。唯一的问题是,当PHP脚本在内存中工作时,其他人可能会编辑该文件,因此您可能希望在读取文件后锁定该文件,并在写入之前解锁。

答案 2 :(得分:0)

如果你在文件上做了很多东西(不仅仅是一次性操作),只要你有足够的内存来包含文件,那么将二进制文件加载到内存中应该更好。

在PHP中,要将文件加载到内存中,可以使用file_get_contents

file_get_contents http://php.net/file_get_contents

$content = file_get_contents('mybinaryfile');

// $content is a string containing the whole content of your binary

然后,您可以使用数组引用“指向”文件中的任何位置

$content[100]; // the 101th character of your binary

完成后,要将其写回,请使用file_put_contents http://php.net/file_put_contents

file_put_contents('mybinaryfile', $content);