Эффективный для памяти способ хранения огромного числа логических выражений в 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 лучше соответствуют вашим потребностям.
Если использование одного бита на значение использует слишком много памяти, вам нужно будет переосмыслить свой дизайн - все в памяти - это просто биты в конце дня, и вы не можете сжать более одного логического значения в один бит (по определению).