Нужна массивоподобная структура в PHP с минимальным использованием памяти

В моем PHP-скрипте мне нужно создать массив из> 600k целых чисел. К сожалению, мои веб-серверыmemory_limit установлен на 32M, поэтому при инициализации массива скрипт прерывается с сообщением

Фатальная ошибка: Допустимый объем памяти 33554432 байт исчерпан (попытался выделить 71 байт) в/home/www/myaccount/html/mem_test.php онлайн8

Я осознаю тот факт, что PHP хранит значения массива не в виде простых целых чисел, а в виде значений z, которые намного больше, чем значения целых чисел (8 байт в моей 64-битной системе). Я написал небольшой скрипт для оценки объема памяти, используемого каждой записью массива, и оказалось, что он составляет почти 128 байтов. 128 !!! Мне нужно> 73M только для хранения массива. К сожалению, веб-сервер не находится под моим контролем, поэтому я не могу увеличитьmemory_limit.

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

Редактировать: ТакdecezeРешение работает из коробки с 32-разрядными целыми числами. Но даже если вы работаете в 64-битной системе,упаковка () похоже, не поддерживает 64-битные целые числа. Чтобы использовать 64-битные целые числа в моем массиве, я применил некоторые битовые манипуляции. Возможно, следующие фрагменты будут полезны для кого-то:

function push_back(&$storage, $value)
{
    // split the 64-bit value into two 32-bit chunks, then pass these to pack().
    $storage .= pack('ll', ($value>>32), $value);
}

function get(&$storage, $idx)
{
    // read two 32-bit chunks from $storage and glue them back together.
    return (current(unpack('l', substr($storage, $idx * 8, 4)))<<32 |
            current(unpack('l', substr($storage, $idx * 8+4, 4))));
}

Ответы на вопрос(8)

Ваш ответ на вопрос