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

时间:2011-06-17 04:43:38

标签: php arrays memory

我正在尝试使用SplFixedArray。我已经完成了一些动态数组的工作,我正在尝试将其转换为更高内存效率的固定数组(有限的RAM可以使用)。

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

$array[x][y]['field']

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

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

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:8)

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

正如我在你的other question中所说明的,SplFixedArrays使用更少的内存。这是事实,您可以在PHP源代码中查看如何创建对象。这些数字并不存在。

但它只是一个难题......如果你在数组中存储大量的东西或正在使用其他数据结构,那么阵列可能不是内存使用的“瓶颈”。 / p>

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

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

同样,1024 * 1024大小的数组的基准测试,每个插槽中有64位整数:

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

正如您所看到的,如果您从theArray加载,那么您使用的是更多内存,但在删除临时数组之后,它又回到了节省。但由于目标是最小化峰值内存使用量,因此使用fromArray将比仅使用数组更糟糕。

答案 1 :(得分:3)

我的经验是,大多数Spl类并不是对本机阵列性能的真正改进。最好的测试证明是不确定的,更糟糕​​的是,它们显示Spl库更慢。

主要好处是什么?它们比数组更可靠,更一致。 SplFixedArray为您提供知道索引是整数的好处(数字索引,我相信,实际上比字符串索引更快),并且您可以专门设置长度 - 如果你有一个主要的奖励不知道你是如何得到一些奇怪的额外价值的。

答案 2 :(得分:0)

我也对它进行了一些测试。使用SplFixedArray::fromArray似乎毫无意义。节省的内存几乎不可察觉。