Можно ли использовать короткие целые (16-битные) в PHP?

Справочная информация: У меня есть большой 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 ())

5
задан dave1010 8 September 2010 в 10:30
поделиться