背景:我有一个大的2D整数数组,我需要在PHP中为每个Apache请求加载到内存中。我希望它占用更少的内存。
PHP以PHP_INT_SIZE
字节存储整数,在大多数系统上为32位。所有整数都小于2 ^ 16,这意味着它们可以是short int(例如在C中)。我是否正确地认为将short存储为short会占用一半的RAM?
理想情况下,我希望能够做到:
$s = (short) 1234; // takes up 2 bytes instead of 4
更多信息:
一些疯狂的想法:
答案 0 :(得分:4)
我不推荐最后一种方法。 : - )
对于快速解决方案,我使用以下方法将2个整数打包为1个PHP整数:
$big = $int1 + ($int2<<16);
And uppack as:
$int1 = $big & 65535;
$int2 = ($big>>16) & 65535;
此外,BIG赞成使用共享内存。这将使您的APP更快。
答案 1 :(得分:2)
这不是PHP专为此设计的任务。
我建议您编写一个具有内存数据的应用程序,并使用它进行计算,然后在PHP中与它进行交互以获得结果。
在大多数64位Unix类平台上,PHP的整数大小实际上是64位。
共享内存不是一个很好的选择,因为你仍然需要将数据复制到PHP的内存空间。
编写一个将所有东西保存在内存中并直接访问它的扩展是可能的,但不是很实用,因为你必须使用共享内存(或其他一些IPC机制),因为你通常运行几个PHP进程。
答案 2 :(得分:1)
我以二进制打包格式生成并存储数组,并仅在需要时提取数字
function elem($n) {
global $buf;
return (ord($buf[$n << 1]) << 8) | ord($buf[$n << 1 | 1]);
}
$buf = file_get_contents(binary file generated by cron);
if(elem(2) > elem(10)).....
你可以通过编写一个实现ArrayAccess的类来使它变得更加漂亮,这样你就可以在其余代码中使用myPackedArray [x]而不是elem(x)。