Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SplFixedArray::fromArray-内存效率与本机固定阵列相同?PHP 5.3.5_Php_Arrays_Memory - Fatal编程技术网

SplFixedArray::fromArray-内存效率与本机固定阵列相同?PHP 5.3.5

SplFixedArray::fromArray-内存效率与本机固定阵列相同?PHP 5.3.5,php,arrays,memory,Php,Arrays,Memory,我正在试验SplFixedArray。我对动态阵列做了一些工作,我正试图将其转换为内存效率更高的固定阵列(有限的RAM) 阅读一些PHP文档,在标题中找到函数,然后应用到如下数组: $array[x][y]['field'] (以字符串作为索引的3d数组,在固定数组中不可能) 我检查了一下,与标准数组相比,这个数组是否可以节省一些内存,否。将字符串索引替换为数字,与生成数组所使用的内存量(94MB)相同 如果我正确地使用SplFixedArray(不是从现有阵列转换),我会将使用的内存降低到7

我正在试验SplFixedArray。我对动态阵列做了一些工作,我正试图将其转换为内存效率更高的固定阵列(有限的RAM)

阅读一些PHP文档,在标题中找到函数,然后应用到如下数组:

$array[x][y]['field']
(以字符串作为索引的3d数组,在固定数组中不可能)

我检查了一下,与标准数组相比,这个数组是否可以节省一些内存,否。将字符串索引替换为数字,与生成数组所使用的内存量(94MB)相同

如果我正确地使用SplFixedArray(不是从现有阵列转换),我会将使用的内存降低到74mb,但我有很多函数和rutine,它们与基本3d阵列一起工作,如果将所有内容都转换为“正确的”固定阵列,那将是一件痛苦的事情。这就是为什么当我读到abut SPL::fromArray时,我跳到了椅子上。但通过这些测试,我发现零内存和速度的好处

我用得不对吗?这个函数只是用于其他类型的东西吗


谢谢

根据我的经验,大多数Spl类并不是对本机阵列性能的真正改进。在最好的情况下,测试被证明是不确定的,在更坏的情况下,它们显示Spl库速度较慢


主要的好处是什么?它们是比数组更可靠和一致的对象。SplFixedArray让您知道索引是int(我相信数字索引实际上比字符串索引快),您可以专门设置长度——如果您不知道如何得到一些奇异的额外值,这将是一个很大的好处。

它的缺点是PHP不适合以高效内存的方式处理如此大的数据结构。你所做的一切都不会改变这一点。尝试在256MB VPS中使用PHP是非常困难的,特别是如果您有web服务器和数据库服务器

正如我在您的示例中所示,SPLFixedArray使用的内存更少。这是事实,您可以在PHP源代码中查找对象是如何创建的。这些数字不会说谎

但这只是拼图的一部分。。。如果您正在阵列中存储大量大数据或使用其他数据结构,那么阵列可能不是内存使用的“瓶颈”

关于
SplFixedArray::fromArray()
,您肯定会增加峰值使用量,因为您现在正在创建两个数组结构。如果删除临时数组,那么将使用更少的内存。。。但在此期间,您将使用更多

如果您只编写自己的函数,将临时数组中的一个元素逐个移位并将其添加到SplFixedArray中,您可能会使用更少的峰值内存,因为您不会复制数据结构大小。(由于写下即复制,实际节省可能不会太大。)

同样,一些1024*1024大小数组的基准测试在每个插槽中包含64位整数:

SplFixedArray:            92,914,280
array:                   218,756,976
SplFixedArray::fromArray 227,147,408 peak, 92,915,088 after

如您所见,如果从数组加载,您将使用更多内存,但删除临时数组后,它将恢复到节省的内存。但由于目标是最小化峰值内存使用,因此使用
fromArray
将比简单使用数组更糟糕。

我也对其进行了一些测试。使用
SplFixedArray::fromArray
似乎没有任何意义。节省的内存几乎不值得注意

对于像我这样好奇的人,这里有一些我刚刚发现的比较基准。(,以及对@Wiseguy的评论)@Wiseguy好吧,这些基准肯定解释了我上次研究这个问题时得到的混乱回答。单个256元素数组根本不足以利用SPLFixedArray更高效的结构。SPLFixedArray只是在数组键上有一些节省,而不是在值上。仍然有很多PHP zval开销。与普通PHP数组的区别在于,它是一个纯索引列表,而不是字典。但是速度优势并没有实现,因为这一功能受到限制,解释器针对普通数组/dict进行了优化。请看-答案是:这取决于您正在做什么以及您在其中获得了多少数据。SplFixedArray可以显著提高性能。实际上,数组是3D的,总值为256*256*5。注意,在这种情况下,您将创建1+256*256 SplFixedArray对象,每个对象都会消耗典型的PHP开销。我刚刚测试过,当使用这种大小的3D SplFixedArray和整数时,内存使用量是55M,但当使用平面2D SplFixedArray[256*256*5]时,内存使用量是19M。因此,它表明,如果您想要最小化内存使用,您需要最小化PHP对象的数量。
SplFixedArray:            92,914,280
array:                   218,756,976
SplFixedArray::fromArray 227,147,408 peak, 92,915,088 after