拆分二进制原始文件,而不转换为数组php

时间:2018-08-05 06:16:03

标签: 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

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

3 个答案:

答案 0 :(得分:1)

一种简单的方法是使用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)。

不确定这样做会带来多少性能提升,但这是您必须自己测试的东西。

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

答案 1 :(得分:0)

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

Does PHP have threading?

答案 2 :(得分:0)

鉴于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实现,因此它们应该非常快并且需要很少的内存。