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

可以在PHP中使用短整数(16位)吗?,php,memory,memory-management,Php,Memory,Memory Management,背景:我有一个大的2D整数数组,我需要为每个Apache请求在PHP中加载到内存中。我希望它占用更少的内存 PHP将整数存储在PHP\u INT\u SIZE字节中,在大多数系统中为32位。所有整数都小于2^16,这意味着它们可能是a(如C中的)。我认为尽可能短地存储int会占用内存的一半,对吗 理想情况下,我希望能够做到: $s = (short) 1234; // takes up 2 bytes instead of 4 更多信息: 该阵列占用大约100mb的RAM,通过包含30MB转

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

PHP将整数存储在
PHP\u INT\u SIZE
字节中,在大多数系统中为32位。所有整数都小于2^16,这意味着它们可能是a(如C中的)。我认为尽可能短地存储int会占用内存的一半,对吗

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

$s = (short) 1234; // takes up 2 bytes instead of 4
更多信息:

  • 该阵列占用大约100mb的RAM,通过包含30MB转储生成
  • 数组是在cron进程中写入的。只有读取需要内存有效(且快速)
  • 我需要对整数执行的唯一操作是比较所有整数(,==),然后读取其中一些(类似于)
  • 从数据库中读取每个值的速度太慢,因为每个请求有几亿次读取
一些疯狂的想法:

  • 使用/但在解包时仍将值存储为32位整数
  • 将值存储为图像中的像素,并使用PHP读取它们(这会很慢吗)
  • 使用并让Apache进程共享该阵列
  • 可能会工作,但我没有使用它的经验,我猜它会比原生PHP数组慢很多倍
  • 学习C++并编写PHP扩展< /LI>
  • 重新编译PHP(或?)以将2个字节用于INT
  • 使用(有用,但与pack()有相同的问题)

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

      对于快速解决方案,我将使用以下方法将2个整数打包到1个PHP整数中:

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

      另外,对于使用共享内存,大家都竖起大拇指。这将使你的应用程序更快。

      这不是PHP设计的任务

      我建议您编写一个应用程序,将数据存储在内存中并使用它进行计算,然后在PHP中与之交互以获得结果

      在大多数64位类Unix平台上,PHP的整数大小实际上是64位的

      共享内存不是一个很好的选择,因为您仍然需要将数据复制到PHP的内存空间


      编写一个将所有内容都保存在内存中并直接访问的扩展是可能的,但不太实用,因为无论如何都必须使用共享内存(或其他IPC机制),因为您通常会运行几个PHP进程。

      我会以二进制压缩格式生成并存储数组,并仅在需要时提取数字

      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)).....
      
      功能元素($n){
      全球$buf;
      
      返回(ord)(基本单位:美元)[$n看起来是一个不错的解决方案。整数需要随机访问,这样可能会有一些CPU开销,但如果它能工作,那么节省的内存应该是值得的。我会尝试一下…一定要使用shmop_*函数…除此之外,我只能想到Barsmonder提出的同样的东西。你确定不能使用m吗ysql和内存表?也许您甚至可以以查询形式编写比较,以避免使用phpserialize和unserialize来回发送数据,它们比var_export更快,btw@Michael,一个MySQL可能是可能的。我必须研究它。@ravelen,serialize比var\u export快,但没有序列化(file\u get\u contents())快于要求?unserialize似乎使用了更多的内存。我想写一些与PHP接口的东西,但我不知道从哪里开始。有指针吗?你可以使用套接字或某种形式的。对于Java,你可以使用。谢谢。一次只需要数组的一部分在PHP的内存空间中,所以我认为shmop函数可以工作。共享内存y将是理想的解决方案,因为这样可以更好地扩展。