Это касается моего сообщения здесь, но в совершенно другом направлении. Определение Charset в PHP
По сути, я ищу, чтобы уменьшить память, которую вызывает множество огромных массивов.
Эти массивы просто полны целых чисел, но, видя, что PHP использует 32-битные и 64-битные целые числа внутри (в зависимости от того, какую версию вы скомпилировали для вашего типа процессора), он ест память.
есть ли способ обмануть PHP в использовании 8-битных или 16-битных целых чисел?
Я думал об использовании пакета (); для этого я могу иметь массив упакованных двоичных значений и просто распаковывать их по мере необходимости (да, я знаю, что это сделает его медленнее, но намного быстрее, чем альтернатива загрузки, а затем выполняется через каждый массив по отдельности, поскольку вы можете передавать текст, так что все они должны быть в памяти одновременно, чтобы ускорить)
можете ли вы предложить какие-либо альтернативы для достижения этого? Я знаю, что это очень хаки, но мне нужно предотвратить огромные всплески памяти.
Не говори никому!
class IntegerstringArray IMPLEMENTS ArrayAccess { var $evil = "0000111122220000ffff"; // 16 bit each function offsetExists ( $offset ) { return (strlen($this->evil) / 4) - 1 >= $offset; } function offsetGet ( $offset ) { return hexdec(substr($this->evil, $offset * 4, 4)); } function offsetSet ( $offset , $value ) { $hex = dechex($value); if ($fill = 4 - strlen($hex)) { $hex = str_repeat("0", $fill) . $hex; } for ($i=0; $i<4; $i++) { $this->evil[$offset*4+$i] = $hex[$i]; } } function offsetUnset ( $offset ) { assert(false); } }
Таким образом, вы можете в значительной степени создать объект массива из этого:
$array = new IntegerstringArray(); $array[2] = 65535; print $array[2];
Он внутренне сохраняет список и принимает 16-битные целые числа. Смещения массива должны быть последовательными.
Не испытано. Как руководство по внедрению.