Эффективный для памяти способ хранения огромного числа логических выражений в PHP

Я ищу эффективный способ хранения огромного количества логических значений (до 2,5*10e11) в памяти PHP. Моей первой идеей было создать массив целых чисел и хранить одно логическое значение на бит в каждом целом числе:

// 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

Однако издержки этого решения все еще слишком велики: для хранения 10^8 логических значений (битов) в 32-разрядной среде (PHP_INT_SIZE = 4 байта) требуется массив из 3125000 целых чисел, потребляющий ~ 254 МБ памяти, тогда как редкий для данных 10^8 логических значений потребуется всего ~ 12 МБ.

Так какой же лучший способ хранить огромное количество логических выражений в PHP (5)?

3 ответа

Решение

Если вам действительно нужно использовать массив с таким количеством логических значений, вы можете использовать строку в качестве ByteArray и упаковать 8 логических значений для каждого символа в строке. Это требует очень мало памяти по сравнению с собственным массивом PHP, но его сложнее использовать.
Вы можете конвертировать байты в символы и обратно с помощью функций ord и chr.

Возможно, классы SplStack или SplFixedArray из SPL лучше соответствуют вашим потребностям.

Если использование одного бита на значение использует слишком много памяти, вам нужно будет переосмыслить свой дизайн - все в памяти - это просто биты в конце дня, и вы не можете сжать более одного логического значения в один бит (по определению).

Другие вопросы по тегам