在 PHP 中存储大量布尔值的内存高效方法


Memory efficient way to store huge number of booleans in PHP

我正在寻找一种有效的方法来在 PHP 的内存中存储大量布尔值(高达 2.5*10e11)。我的第一个想法是创建一个整数数组,并在每个整数中为每个位存储一个布尔值:

// number of booleans to store
$n = 2.5 * pow(10, 11);
// bits per integer
$bitsPerInt = PHP_INT_SIZE * 8;
// init storage
$storage = array();
for ($i=0; $i<ceil($n/$bitsPerInt); $i++) {
    $storage[$i] = 0;
}
// bits in each integer can be accessed using PHP's bitwise operators

但是,此解决方案的开销仍然太大:在 32 位环境中存储 10^8 个布尔值(位)(PHP_INT_SIZE = 4 字节)需要一个 3125000 个整数的数组,消耗 ~ 254 MB 的内存,而 10^8 个布尔值的稀有数据只需要 ~ 12 MB。

那么在 PHP (5) 中存储大量布尔值的最佳方法是什么?

如果你真的必须使用一个包含那么多布尔值的数组,你可以使用一个字符串作为 ByteArray,并为字符串中的每个字符打包 8 个布尔值。与本机PHP数组相比,这具有很少的内存开销,但更难使用。
您可以使用 ord 和 chr 函数将字节转换为字符并返回。

也许SPL中的SplStack或SplFixedArray类更适合您的需求。

如果每个值使用一位使用太多内存,那么您将需要重新考虑您的设计 - 内存中的所有内容最终都只是位,并且您不能将多个布尔值压缩到单个位中(根据定义)。