背景:对于每个Apache请求,我需要将大量的2D整数数组加载到PHP的内存中。我希望它占用更少的内存。

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

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

$s = (short) 1234; // takes up 2 bytes instead of 4

更多信息:
  • 该数组占用约100mb RAM,是通过包含30MB var_export() dump
  • 生成的
  • 该数组是在cron进程中编写的。只有读数才需要高效存储(且快速)
  • 我需要对整数进行的唯一操作是比较所有整数(,===),然后读取其中的一些(类似于Floyd-Warshall algorithm)
  • 从数据库读取每个值太慢了,因为每个请求有几亿次读取

    一些疯狂的想法:
  • 使用pack()/unpack(),但在解压缩后仍将值存储为32位整数
  • 将值存储为图像中的像素,并使用PHP的GD library读取它们(这会很慢)
  • 使用shmop_read()并让Apache进程共享数组
  • Memcached可能有效,但是我没有经验,我想它比本地PHP数组
  • 慢许多倍
  • 学习C++并编写PHP扩展
  • 重新编译PHP(或HipHop?)以将2个字节用于int
  • 使用Igbinary(很有用,但与pack()会有相同的问题)
  • 最佳答案

    我不建议使用最后一种方法。 :-)

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

    $big = $int1 + ($int2<<16);
    
    And uppack as:
    
    $int1 = $big & 65535;
    $int2 = ($big>>16) & 65535;
    

    另外,BIG赞成使用共享内存。这将使您的APP更快。

    09-30 19:11
    查看更多