是否可以在PHP中使用短整数(16位)?

时间:2010-09-07 13:30:20

标签: php memory memory-management

背景:我有一个大的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

更多信息:

  • 该阵列占用大约100mb的RAM,并通过包含30MB var_export()转储
  • 生成
  • 数组是用cron进程编写的。只有阅读需要内存效率(和快速)
  • 我需要对整数执行的唯一操作是比较所有这些操作(<,>,===),然后阅读其中一些(类似于Floyd-Warshall algorithm
  • 从数据库读取每个值太慢,因为每个请求有几亿次读取

一些疯狂的想法:

  • 使用pack() / unpack(),但在解压缩时仍会将值存储为32位整数
  • 将值存储为图像中的像素,并使用PHP的GD library来读取它们(这会很慢)
  • 使用shmop_read()并让Apache进程共享阵列
  • Memcached可能会有效,但我对它没有经验,我猜它会比原生PHP数组慢很多次
  • 学习C ++并编写PHP扩展
  • 重新编译PHP(或HipHop?)以使用2个字节进行整理
  • 使用Igbinary(有用,但与pack()有相同的问题)

3 个答案:

答案 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)。