1

我有一个脚本可以执行一大堆freadfseek调用二进制文件,使用这样创建的文件指针:

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

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

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

如果是这样,我想知道将整个文件加载到内存中并像这样使用它是否会更好。会吗?

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

编辑:而且,如果可以将文件放入内存,那么在坚持指针方法的同时,这是如何实现的?这些文件每个只有大约 3MB,所以内存不足应该不是问题。

4

3 回答 3

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
于 2012-04-23T01:58:42.890 回答
0

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

于 2012-04-23T01:53:12.627 回答
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);
于 2012-04-23T01:54:01.633 回答