内存有效的方式来存储PHP中的大量布尔值

时间:2012-08-07 11:47:19

标签: php boolean memory-efficient

我正在寻找一种在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)中存储大量布尔值的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

如果你真的必须使用那么多布尔数组,你可以使用一个字符串作为ByteArray,并为字符串中的每个字符串打包8个布尔值。与原生PHP数组相比,这几乎没有内存开销,但使用起来比较困难 您可以使用ordchr函数将字节转换为字符并返回。

答案 1 :(得分:1)

可能来自SPL的SplStack或SplFixedArray类更符合您的需求。

答案 2 :(得分:0)

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