欺骗PHP整数

欺骗PHP整数,php,Php,这与我在这里的帖子有关,但方向完全不同 本质上,我希望减少许多大型阵列造成的内存 这些数组中充满了整数,但由于PHP在内部使用32位和64位整数(取决于您为CPU类型编译的版本),它会占用内存 有没有办法欺骗PHP使用8位或16位整数 我考虑过使用pack();为了实现这一点,我可以拥有一个压缩的二进制值数组,并根据需要将其解包(是的,我知道这会使速度变慢,但比加载然后逐个运行每个数组要快得多,因为可以对文本进行流式处理,所以它们都需要同时存储在内存中以保持速度) 你能提出更好的替代方案来实现

这与我在这里的帖子有关,但方向完全不同

本质上,我希望减少许多大型阵列造成的内存

这些数组中充满了整数,但由于PHP在内部使用32位和64位整数(取决于您为CPU类型编译的版本),它会占用内存

有没有办法欺骗PHP使用8位或16位整数

我考虑过使用pack();为了实现这一点,我可以拥有一个压缩的二进制值数组,并根据需要将其解包(是的,我知道这会使速度变慢,但比加载然后逐个运行每个数组要快得多,因为可以对文本进行流式处理,所以它们都需要同时存储在内存中以保持速度)

你能提出更好的替代方案来实现这一点吗?我知道这很有黑客味,但我需要防止巨大的内存激增。

不要告诉任何人

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);
    }

}
它在内部存储一个列表并接受16位整数。阵列偏移必须是连续的

没有测试。作为实施指南


这听起来不像是减少内存使用的明智策略。是什么导致了脚本中的激增?你能举几个例子吗?真的有必要一次将这些巨大的阵列加载到内存中吗?你在用它们做什么?稍微有用一点的提示:如果你想用大量的数字,就不要用PHP。尝试一些更有效的资源。(C/C++)我同意Pekka的观点,PHP已经有了相当好的内存管理,更改整数的位长度不是一个好的解决方案。相反,您应该查看实际原因,即大型阵列本身。如果您能提供更多有关您正在执行的操作的详细信息,我们可能会提供更多帮助。@Ernon:True,但在PHP最常用的环境(远程/web服务器)中,C/C++很少是一个简单或可行的选项。在PHP中使用整数数组的真正问题不是整数位宽度,而是数组本身。PHP没有任何功能。它有字典。如果你想节省内存,那么尽可能使用。否则您将不得不进行微优化:将数组打包成一个字符串,每个字符串使用四个字符来打包一个十六进制字符串。(在PHP中,你只能用内存换取速度)。哈哈,它将进入一个开源库,很不幸,我不得不告诉:P我将把它标记为黑客,并对代码中的建议给予应有的信任。再次感谢,这已经困扰了我两个月:)+1代表邪恶。还修复了您在测试中发现的一个打字错误。@Charles:我会声称这是一个故意的打字错误,以防止人们实际使用它。但是,唉,这是一个普通的打字错误:}谢谢!我刚刚使用30000次迭代在所有3个平台上运行了基准测试。(16位整数的实际尺寸,我知道最大值约为32000)。阵列-速度最快,但使用了3.42mb splFixedArray-与阵列速度非常相似。它们之间的间隔为0.001秒,但仅使用1.69mb。(比我预期的要多。100万次迭代使用了标准数组大小的50%)IntegerstringArray-迄今为止速度最慢。比splFixedArry慢10倍,但使用米斯利0.43mb。这是在ubuntu 10.10上的64位PHP5.3.3构建的。我想我会两全其美。用户将能够选择:)刚刚运行了另一个测试。使用pack('v')代替十六进制转换的速度相同,并且将内存进一步降低到0.38mb。我想我会提供2个选项给用户。允许节省内存或允许性能。这将使两个世界都达到最佳状态:)此外,在所有情况下,简单地说,获得而不是设置的速度几乎是设置速度的两倍。数组和splfixedarray为0.02秒,integerstringArray为0.22秒(包和十六进制转换)。但这也在for循环中,因此循环时间会增加。再次感谢所有的帮助:D我终于可以完成这个项目了:D
$array = new IntegerstringArray();
$array[2] = 65535;
print $array[2];