Справочная информация: У меня есть большой 2D-массив целых чисел, который мне нужно загружать в память в PHP для каждого запроса Apache. Я хочу, чтобы он занимал меньше памяти.
PHP хранит целые числа в PHP_INT_SIZE
байтах, что в большинстве систем составляет 32 бита. Все целые числа меньше 2 ^ 16, что означает, что они могут быть коротким int (например, в C). Правильно ли я полагаю, что хранение таких коротких целых чисел займет половину ОЗУ?
В идеале я бы хотел иметь возможность:
$s = (short) 1234; // takes up 2 bytes instead of 4
Дополнительная информация:
- Массив занимает около 100 МБ ОЗУ и создается путем включения дампа размером 30 МБ var_export ()
- Массив записывается в процессе cron. Только чтение должно быть эффективным (и быстрым) с точки зрения памяти
- Единственные операции, которые мне нужно проделать с целыми числами, - это сравнить их все (, ===), а затем прочитать некоторые из них (аналогично Алгоритм Флойда-Уоршалла )
- Чтение каждого значения из БД происходит слишком медленно, так как на один запрос приходится несколько сотен миллионов операций чтения
Некоторые безумные идеи:
- Используйте pack ( ) / unpack () , но это все равно сохранит значения как 32-битные целые числа, когда они были распакованы
- Сохраните значения как пиксели в изображении и используйте PHP ' s Библиотека GD для их чтения (это будет медленно)
- Используйте shmop_read () и пусть процессы Apache совместно используют массив
- Memcached может работать, но я у меня нет опыта работы с ним, и я предполагаю, что это будет во много раз медленнее, чем собственный массив PHP
- Изучите C ++ и напишите расширение PHP
- Перекомпилируйте PHP (или HipHop ?), чтобы использовать 2 байта для ints
- Используйте Igbinary (полезно, но будет иметь ту же проблему, что и pack ())
задан dave1010 8 September 2010 в 10:30
поделиться