我正在使用以下代码将二进制文件转换为数组。
$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
我认为这很简单,只是不确定如何做到。
答案 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)
答案 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实现,因此它们应该非常快并且需要很少的内存。