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

dav*_*010 5 php memory memory-management

背景:我有一个大的2D整数数组,我需要在PHP中为每个Apache请求加载到内存中.我希望它占用更少的内存.

PHP以PHP_INT_SIZE字节为单位存储整数,在大多数系统上为32位.所有整数都小于2 ^ 16,这意味着它们可以是一个短整数(例如在C中).我是否正确地认为将short存储为short会占用一半的RAM?

理想情况下,我希望能够做到:

$s = (short) 1234; // takes up 2 bytes instead of 4
Run Code Online (Sandbox Code Playgroud)

更多信息:

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

一些疯狂的想法:

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

Bar*_*ter 4

我不会推荐最后一种方法。:-)

为了快速解决方案,我将使用以下方法将 2 个整数打包为 1 个 PHP 整数:

$big = $int1 + ($int2<<16);

And uppack as:

$int1 = $big & 65535;
$int2 = ($big>>16) & 65535;
Run Code Online (Sandbox Code Playgroud)

另外,对使用共享内存表示赞赏。这将使您的应用程序更快。