【问题标题】:Memory efficient way to store huge number of booleans in PHP在 PHP 中存储大量布尔值的内存有效方法
【发布时间】:2012-08-04 10:16:12
【问题描述】:

我正在寻找一种在 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 位环境(PHP_INT_SIZE = 4 字节)中存储 10^8 个布尔值(位)需要 3125000 个整数的数组,消耗约 254 MB 内存,而 10^8 个布尔值的稀有数据只需要 ~ 12 MB。

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

【问题讨论】:

  • 可能取决于您需要整数的用途。由于数组不是关联的,因此顺序可能很重要。存储是否像堆栈一样使用?
  • 我需要访问给定索引处的布尔值(位),例如在数组中。
  • 您可能可以使用混合解决方案。您在内存中加载的只是一个选择,其余的则保留在一些文件中。当你想要一个不在缓存中的布尔值时,你加载适当的文件。

标签: php boolean memory-efficient


【解决方案1】:

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

【讨论】:

  • 谢谢,这对我来说是正确的提示。使用$storage = str_pad('', ceil($n/8), chr(0)); 设置存储非常快,并且对于我之前测试过的上述 10^8 个布尔值仅消耗约 12 MB。
【解决方案2】:

SPL 中的 SplStack 或 SplFixedArray 类可能更适合您的需求。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 每个值使用一位(布尔值)并不是太多的内存,这将是最佳解决方案。但是我的解决方案需要更多的内存,而且在 PHP 中使用布尔类型的变量更糟糕。
    猜你喜欢
    • 2011-06-02
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2021-09-27
    • 2018-11-25
    • 2016-04-01
    相关资源
    最近更新 更多