gpt4 book ai didi

php - unpack(C*,data) Eats Memory [php 在 unpack 函数上耗尽内存]

转载 作者:搜寻专家 更新时间:2023-10-31 21:09:50 27 4
gpt4 key购买 nike

我想按照建议在 php 中读取一个二进制文件作为字节 [] hereunpack 'ed fread 的输出。所以我有类似的东西:

$file=fopen($filename,'r');
fseek($file, $offset); //file is 500MB so i take it 10MB at a time
$tmp = fread($file,$len);
//so far so good , $tmp includes 10MB of data
var_dump(strlen($tmp)); //int(10485760) 10MB
var_dump(memory_get_usage(true)); //int(11272192) 11MB
$data = unpack('C*',$tmp);

这抛出

PHP Fatal error:  Allowed memory size of 536870912 bytes exhausted (tried to allocate 32 bytes) in [myfile.php] on line [unpack line]

因为错误表明内存限制设置为 512MB,并且根据 memory_get_usage只使用了 11/512MB,我正在解压一个 10MB 的字符串。它最多应该需要 30MB($tmp 10MB,$data 10MB,内部变量 10MB)。为什么它会爆炸并且无法用 512MB 内存解压 $tmp?

所以问题是,我在这里做错了什么还是一个错误?还有其他方法可以获取字节数组(0 到 255)以读取 php 中的二进制文件,还是我应该切换到另一种语言来执行此操作?

附加说明:该代码适用于 117KB 的文件。

php -v
PHP 5.5.3-1ubuntu2.2 (cli) (built: Feb 28 2014 20:06:05)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies

最佳答案

在 PHP 中,变量在内部存储为 zval。数组中的每个元素将占用比您预期更多的内存。这是因为 PHP 是一种弱类型语言,因此需要能够在内部快速交换变量的类型。还有 GC 的开销以及 PHP 中的数组实际上是一个哈希表这一事实。

您可以在此处找到详细信息:

http://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html

但是,基本上创建一个包含 10485760 个元素的数组需要大约。 32 位 760MB,64 位 1440MB。

您最好的选择很可能是不解压字符串,而是当您需要 would be 数组中的某个元素时才能访问字符串中的某个位置。

例如,您可以使用使用此概念的库:

https://github.com/reiner-dolp/PHP-Memory-Efficient-Arrays

关于php - unpack(C*,data) Eats Memory [php 在 unpack 函数上耗尽内存],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22894784/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com