在我的PHP脚本中,我需要创建一个> 600k整数的数组。不幸的是,我的网络服务器memory_limit设置为32M,因此在初始化阵列时脚本会中止并显示消息
致命错误:在第8行的/home/www/myaccount/html/mem_test.php中,耗尽了33554432字节的允许内存大小(试图分配71字节)
我知道一个事实,PHP不会将数组值存储为纯整数,而是存储为比纯整数值(在我的64位系统上为8个字节)大得多的zvalues。我写了一个小脚本来估算每个数组条目使用多少内存,结果证明它恰好是128个字节。128 !!!我需要> 73M来存储阵列。不幸的是,网络服务器不受我的控制,所以我不能增加该服务器memory_limit。
我的问题是,PHP是否有可能创建使用更少内存的类似数组的结构。我不需要这种结构具有关联性(普通索引访问就足够了)。它还不需要动态调整大小-我确切地知道数组将有多大。同样,所有元素都是相同的类型。就像一个好的旧C阵列一样。 问题来源于stack overflow
您将获得的最高内存效率可能是将所有内容存储在字符串中,并以二进制压缩,并对其进行手动索引。
$storage = '';
$storage .= pack('l', 42);
// ...
// get 10th entry $int = current(unpack('l', substr($storage, 9 * 4, 4))); 如果“数组”初始化可以一口气完成,而您只是从结构中读取,那将是可行的。如果需要大量附加到字符串,则效率极低。即使这样,也可以使用资源句柄来完成:
$storage = fopen('php://memory', 'r+'); fwrite($storage, pack('l', 42)); ... 这是非常有效的。然后,您可以将该缓冲区读回到变量中并用作字符串,或者可以继续使用资源和fseek。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。