草庐IT

php - SplFixedArray::fromArray - 与 native 固定数组一样高效的内存? PHP 5.3.5

coder 2024-04-10 原文

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

阅读一些 PHP 文档,在标题中找到该函数并继续仅应用于如下数组:

$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 时我跳到椅子上的原因。但是通过这些测试,我发现零内存和速度优势。

我没有正确使用它吗?此功能是否仅适用于其他类型的东西?

谢谢!

最佳答案

简而言之,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

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

关于php - SplFixedArray::fromArray - 与 native 固定数组一样高效的内存? PHP 5.3.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6381431/

有关php - SplFixedArray::fromArray - 与 native 固定数组一样高效的内存? PHP 5.3.5的更多相关文章

  1. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  2. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  3. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  4. ruby - Ruby 1.9.1 中的 native 线程,对我有什么好处? - 2

    所以,Ruby1.9.1现在是declaredstable.Rails应该与它一起工作,并且正在慢慢地将gem移植到它。它具有native线程和全局解释器锁(GIL)。自从GIL到位后,原生线程是否比1.9.1中的绿色线程有任何优势? 最佳答案 1.9中的线程是原生的,但它们被“放慢了速度”,一次只允许一个线程运行。这是因为如果线程真的并行运行,它会混淆现有代码。优点:IO现在在线程中是异步的。如果一个线程阻塞在IO上,那么另一个线程将继续执行直到IO完成。C扩展可以使用真正的线程。缺点:任何非线程安全的C扩展都可能存在使用Thre

  5. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  6. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  7. ruby - 如何在 Ruby 中返回整数的固定长度二进制表示? - 2

    我知道我可以使用Fixnum#to_s将整数表示为二进制格式的字符串。但是1.to_s(2)生成1而我希望它生成00000001。我怎样才能使所有返回的字符串都以零作为填充到8个字符?我可以使用类似的东西:binary="#{'0'*(8-(1.to_s(2)).size)}#{1.to_s(2)}"if(1.to_s(2)).size但这看起来不是很优雅。 最佳答案 使用字符串格式。"%08b"%1#=>"00000001" 关于ruby-如何在Ruby中返回整数的固定长度二进制表示?

  8. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

  9. java - Java 中的 "caller"和 Ruby 中的 "receiver"一样吗? - 2

    如果我说x.hello()在Java中,对象x正在“调用”它包含的方法。在Ruby中,对象x正在“接收”它包含的方法。这只是表达相同想法的不同术语,还是意识形态上的根本差异?来自Java,我发现Ruby的“接收器”想法非常令人困惑。也许有人可以解释这与Java的关系? 最佳答案 在您的示例中,x不调用hello()。包含该片段的任何对象都是“调用”(即,它是“调用者”)。在Java中,x可以称为接收者;它正在接收对hello()方法的调用。 关于java-Java中的"caller"和R

  10. ruby-on-rails - 安装 fcgi : Failed to build gem native extension 时出现 Rails 错误 - 2

    我正在运行命令bundleinstall在我的Rails项目中,它给出了错误:...Usingactiverecord(3.0.11)Usingactiveresource(3.0.11)Usingbigdecimal(1.1.0)Installingfcgi(0.8.8)withnativeextensionsGem::Installer::ExtensionBuildError:ERROR:Failedtobuildgemnativeextension./home/jjboat/.rvm/rubies/ruby-1.9.3-p194/bin/rubyextconf.rbchecki

随机推荐