【问题标题】:SplFixedArray::fromArray - memory efficient as native fixed Array? PHP 5.3.5SplFixedArray::fromArray - 作为原生固定数组的内存效率? PHP 5.3.5
【发布时间】:2011-09-16 21:48:26
【问题描述】:

我正在试验 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,但我有很多函数和规则可以与基本 3d 数组一起使用,转换起来会很麻烦一切都“正确”的固定数组。这就是为什么当我读到 SPL::fromArray 时,我跳到了我的椅子上。但是通过这些测试,我发现零内存和速度优势。

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

谢谢!

【问题讨论】:

  • 单个 256 个元素的数组根本不够大,无法利用 SPLFixedArray 更有效的结构。
  • SplFixedArray 只是节省了一些数组键,而不是值。仍然有很多 PHP zval 开销。与普通 PHP 数组的区别在于,它是一个纯索引列表,而不是字典。但是速度优势并没有体现出来,因为该功能受到阻碍,解释器针对普通数组/字典进行了优化。
  • matthewturland.com/2010/05/20/new-spl-features-in-php-5-3 - 答案是:这取决于你在做什么以及你在那里获得了多少数据。 SplFixedArray 可以显着提高性能。
  • 其实数组是3D的,值的总数是256*256*5。
  • 请注意,在这种情况下,您将创建 1+256*256 个 SplFixedArray 对象,每个对象都会消耗典型的 PHP 开销。我刚刚测试过,当使用带有整数的那个大小的 3D SplFixedArray 时,内存使用量是 55M,但是当使用平面 2D SplFixedArray[256 * 256 * 5] 时,内存使用量是 19M。所以它表明如果你想最小化内存使用,你需要最小化 PHP 对象的数量。

标签: php arrays memory


【解决方案1】:

简而言之,PHP 并非旨在以高效内存的方式处理如此大的数据结构。你所做的任何事情都不会改变这一点。尝试在 256MB VPS 中运行 PHP 是非常困难的,尤其是如果您有 Web 服务器和数据库服务器。

正如我在您的other question 中说明的那样,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

所以如你所见,如果你从数组中加载,你会使用更多的内存,但是在临时数组被删除之后,它又回到了节省的空间。但由于目标是尽量减少峰值内存使用量,因此使用fromArray 会比简单地使用数组更糟糕。

【讨论】:

    【解决方案2】:

    我的经验是,大多数 Spl 类在本机数组性能方面并没有真正的改进。充其量测试证明没有结论,更糟糕的是,它们显示 Spl 库更慢。

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

    【讨论】:

    • 对于像我这样好奇的人,这里有一些我刚刚找到的比较基准。 (johnciacia.comblog.shay.cothis PHP man page 上的 cmets)
    • @Wiseguy 好吧,这些基准确实解释了我上次研究时得到的混乱反应。
    【解决方案3】:

    我也对其进行了一些测试。使用SplFixedArray::fromArray 似乎没有意义。内存节省几乎不明显。

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2011-03-03
      • 2013-01-07
      • 2014-05-04
      • 2012-01-11
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多