1

PHP のメモリに膨大な数のブール値 (最大 2.5*10e11) を格納する効率的な方法を探しています。私の最初のアイデアは、整数の配列を作成し、各整数のビットごとに 1 つのブール値を格納することでした。

// 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) に格納する最良の方法はどれですか?

4

3 に答える 3

2

本当に多くのブール値の配列を使用する必要がある場合は、文字列を ByteArray として使用し、文字列内の各文字に対して 8 つのブール値をパックできます。これは、ネイティブの PHP 配列に比べてメモリ オーバーヘッドがほとんどありませんが、使用するのはより困難です。ord関数とchr
関数 を使用して、バイトを char に変換し、元に戻すことができます。

于 2012-08-07T12:19:14.767 に答える
1

おそらく、SPLの SplStack または SplFixedArray クラスの方がニーズに適しています。

于 2012-08-07T12:06:27.283 に答える
0

値ごとに 1 ビットを使用すると大量のメモリが使用される場合は、設計を再考する必要があります。メモリ内のすべてのデータは、1 日の終わりには単なるビットであり、複数のブール値を 1 つのビットに絞り込むことはできません (定義によると)。 )。

于 2012-08-07T11:51:51.887 に答える