【问题标题】:Huge array takes more memory space than it should巨大的数组占用的内存空间超出了应有的范围
【发布时间】:2012-08-11 23:30:46
【问题描述】:

目前我的应用使用大约 7 MB 内存。

如果我使用strlen(serialize($array)))) 检查它的大小,该数组似乎使用了 700 KB。

  • 如果在我的应用程序中使用此数组,并检查内存使用情况(使用 memory_get_peak_usage()),我会得到 14 MB。

  • 如果我不使用它,我会得到 7 MB。

如果这个数组需要 700 KB 序列化,为什么 PHP 需要 7 MB 来存储这个变量?还是我以错误的方式进行基准测试?

【问题讨论】:

  • 这个数组/对象中有什么?在内存中表示真实对象可能需要比文本版本更多的分配。
  • 所有 utf8 字符及其 ASCII 等效字符的表。好的,但要多 10 倍??
  • 如果你使用memory_get_usage呢? memory_get_peak_usage 向您展示 peak 的使用情况
  • @ellabeauty,你能至少发布一个你所拥有的东西吗?当我们不知道该表的格式时,您不会得到非常具体的答案。
  • 使用 memory_get_usage 它要少得多:9 M 和 5 M

标签: php arrays memory


【解决方案1】:

如果这让您感到困扰,您想远离 PHP:http://nikic.github.com/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html。 PHP 数组就像一些生活空间。

如果可能的话,您可以使用SplFixedArray,但话又说回来,谁在乎 PHP 数组占用多少空间。如果您正在寻找干净/高性能的东西,为什么要首先使用 PHP(是的,这是来自 PHP 人):)

【讨论】:

  • @brad tnx!在星期六晚上回答问题时,我需要像你这样的人:D
  • 谢谢,我会尝试将我的数组转换为“SplFixedArray”,但这需要很长时间:)
  • @Petra,在 DEFCON 上见过 Hacker Jeopardy 吗?
  • 使用 SplFixedArray,相同的数据占用 12.5 M 和略少的 CPU。它显然好一点,但不是很多。因为数组是多维的(255x255),所以我不得不使用 SplFixedArray::fromArray(...) 将值分配给第一级...
  • 您是否也为阅读博文而烦恼? @Brad 我会的。给我 1:46:59 ;)
【解决方案2】:

序列化格式可以做一些内存优化,因为它们不需要让对象存在于内存中并使其完全可访问。他们只保持数据的完整性,而不是可访问性。如果这有助于回答您的问题。

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2020-08-09
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多