在不转换为数组php的情况下拆分二进制原始文件



我正在使用以下代码将二进制文件转换为数组。

$handle = fopen($file, "r");
$contents = fread($handle,filesize($file));
$array = unpack("s*", $contents);

我希望能够分块读取它,并发送多个单独的请求来并行处理它。例如,我想先获取16000个字节,然后再获取16000个等等。所以我最终会有多组数据要在中并行处理

$content1 = first 16000 bytes
$content2 = bytes from 16000 to 32000
$content3 = bytes from 32000 to 48000

我认为这很简单,我只是不确定如何做到。

一个简单的方法是使用substr()来分割块,直到它用完要处理的东西。。。

$start = 0;
$size = 16000;
$contents = file_get_contents($file);
while ($chunk = substr($contents, $start, $size))   {
// Process
echo ">".$chunk."<".PHP_EOL;

$start +=$size;
}

另一种方法是将其转换为数组,将字符串拆分为块,您可以使用str_split()

$contents = file_get_contents($file);
$chunks = str_split($contents, 16000);

file_get_contents()一次性完成所有打开文件/读取/关闭操作,然后str_split()将其拆分为所需大小的区块数组(在本例中为16000(。

不确定你会从中获得多少性能提升,但这是你必须自己测试的。

(如果您使用的是多字节编码的文件,请查看手册页上的注释(。

您应该在php中使用多线程看见http://php.net/manual/en/intro.pthreads.php

PHP有线程吗?

假设OP已经接受了Nigel的答案,那么问题实际上是如何从文件中读取任意块。这可以通过对原始代码稍作修改来实现。而不是读取完整的文件内容:

fread($handle, filesize($file));
^^^^^^^^^^^^^^^

…你把你的区块大小作为第二个参数:

$contents = fread($handle, 16000);

在此之前,您将移动到所需位置:

// E.g. Read 4th chunk:
fseek($handle, 3 * 16000);

完整的东西:

$handle = fopen($file, "r");
fseek($handle, 3 * 16000);
$contents = fread($handle, 16000);

添加一些错误检查,您就完成了。这些都是非常接近C实现的老函数,所以它们应该非常快,只需要很少的内存。

相关内容

最新更新