在我的PHP脚本中,我需要创建一个> 600k整数的数组.不幸的是,我的web服务器memory_limit
设置为32M,所以在初始化数组时,脚本会中止消息
致命错误:第8行/home/www/myaccount/html/mem_test.php中允许的内存大小为33554432字节(试图分配71个字节)
我知道PHP不会将数组值存储为普通整数,而是存储为比普通整数值大得多的z值(在我的64位系统上为8个字节).我写了一个小脚本来估计每个数组条目使用多少内存,事实证明,它恰好是128个字节.128!我需要> 73M才能存储阵列.不幸的是,网络服务器不在我的控制之下,所以我无法增加memory_limit
.
我的问题是,在PHP中是否有可能创建一个使用更少内存的类似数组的结构.我不需要这种结构是关联的(普通的索引访问就足够了).它也不需要动态调整大小 - 我确切知道数组的大小.此外,所有元素都是相同的类型.就像一个好旧的C阵列.
编辑: 所以deceze的解决方案与32位整数一起开箱即用.但即使您使用的是64位系统,pack()似乎也不支持64位整数.为了在我的数组中使用64位整数,我应用了一些位操作.也许下面的片段对某些人有帮助:
function push_back(&$storage, $value) { // split the 64-bit value into two 32-bit chunks, then pass these to pack(). $storage .= pack('ll', ($value>>32), $value); } function get(&$storage, $idx) { // read two 32-bit chunks from $storage and glue them back together. return (current(unpack('l', substr($storage, $idx * 8, 4)))<<32 | current(unpack('l', substr($storage, $idx * 8+4, 4)))); }
deceze.. 59
您将获得的内存效率最高的可能是将所有内容存储在一个字符串中,以二进制形式打包,并使用手动索引.
$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
.