gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:57:57 26 4
gpt4 key购买 nike

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

PHP 将 int 存储在 PHP_INT_SIZE 字节中,这在大多数系统上是 32 位。所有整数都小于 2^16,这意味着它们可能是 short int (例如在 C 中)。我认为存储尽可能短的整数会占用一半的 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() 相同的问题)

最佳答案

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

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

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

And uppack as:

$int1 = $big & 65535;
$int2 = ($big>>16) & 65535;

此外,大赞使用共享内存。这将使您的应用程序更快。

关于php - 是否可以在 PHP 中使用短整数(16 位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3659058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com