在我的PHP脚本中,我需要创建一个包含600k个整数的数组。不幸的是,我的Web服务器的memory_limit
设置为32M,所以在初始化数组时,脚本会因以下错误信息而终止:
致命错误:在/home/www/myaccount/html/mem_test.php第8行尝试分配71字节的内存时,已用尽33554432字节的内存限制。
我知道PHP将数组值存储为zvalue,而不是普通整数值(在我的64位系统上为8字节),因此每个数组条目使用的内存量要大得多。我编写了一个小脚本来估算每个数组条目使用的内存量,结果显示,它实际上占用了128字节。128!!!我需要>73M的内存才能存储该数组。不幸的是,Web服务器不在我的控制范围之内,因此我不能增加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))));
}
list
返回一个数组... 这有什么意义? - Alexander Tobias Bockstaller