SplFixedArray :: fromArray - 作为本机固定数组的内存效率如何?PHP 5.3.5

Gab*_*lla 4 php memory arrays

我正在尝试使用SplFixedArray.我有一些动态数组的工作,我正在尝试转换为更高效的内存固定数组(有限的RAM工作).

阅读一些PHP文档,在Title中找到该函数,然后继续应用于一个数组,如:

$array[x][y]['field']
Run Code Online (Sandbox Code Playgroud)

(带有字符串作为索引的3d数组,在固定数组中是不可能的)

$testArray =  SplFixedArray::fromArray(generateArray(256)); 
// generateArray is a function to create the array and set it to zero.
Run Code Online (Sandbox Code Playgroud)

我检查了我是否可以通过这个与标准阵列节省一些内存而不是.用数字替换字符串索引,使用相同数量的ram(94 mb)来生成数组.

如果我正确使用SplFixedArray(不是从现有数组转换)我将使用的内存降低到74mb,但是我有很多函数和rutines可以使用基本的3d数组,并且很难将所有内容转换为"适当的"固定阵列.这就是为什么当我读到SPL :: fromArray时,我跳到我的椅子上.但通过这些测试,我发现ZERO内存也没有速度优势.

我没有正确使用它吗?这个功能只适用于其他类型的东西吗?

谢谢!

Mat*_*hew 8

缺点是PHP不是以内存有效的方式处理如此大的数据结构.你所做的一切都不会改变这一点.尝试在256MB VPS内运行PHP非常困难,特别是如果你有一个Web服务器和数据库服务器.

正如我在你的另一个问题中说明的那样,SplFixedArrays使用更少的内存.这是事实,您可以在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
Run Code Online (Sandbox Code Playgroud)

所以如你所见,如果你从theArray加载,你使用的是更多的内存,但是在删除临时数组后,它又回到了节省.但由于目标是最小化峰值内存使用量,因此使用fromArray将比简单地使用数组更糟糕.