【问题标题】:gzinflate: max. space to avoid out-of-memory?gzinflate:最大。避免内存不足的空间?
【发布时间】:2013-03-02 12:22:02
【问题描述】:

gzinflate解压的时候发现——在某些情况下 情况 - 以下代码导致内存不足错误。在 32 位 Linux 上使用 PHP 5.3.20 进行了测试(EC2 上的Amazon Linux AMI)。

$memoryLimit = Misc::bytesFromShorthand(ini_get('memory_limit')); // 256MB
$memoryUsage = memory_get_usage(); // 2MB in actual test case
$remaining = $memoryLimit - $memoryUsage;
$factor = 0.9;
$maxUncompressedSize = max(1, floor($factor * $remaining) - 1000);
$uncompressedData = gzinflate($compressedData, $maxUncompressedSize);

虽然,我保守地计算了$maxUncompressedSize的大小,希望能给gzinflate足够的内存,我还是得到了:

致命错误:第 123 行的 foo.php 中允许的内存大小为 268435456 字节已用尽(尝试分配 266143484 字节)

在将$factor 的值从0.9 更改为0.4 时,在这种情况下,错误就会消失。在其他情况下,0.9 可以。

我想知道:

错误的原因真的是gzinflate 需要两倍以上的未压缩数据空间吗?可能还有其他原因吗? $remaining 真的是应用程序可以使用的剩余内存吗?

【问题讨论】:

  • 你到底是什么gzinflate() 这么大?
  • PHP 不是 C,你不能期望gzinflate 和 PHP 需要的大小不超过未压缩字符串的大小(即使你留有余量)。另外,PHP 在内存方面相当松散,这可能是正常行为。
  • @Pekka 我缩小了来自 API 的响应,其中一些确实非常大。不幸的是,这超出了我的控制范围。无论如何,未压缩数据的大小并不重要:正如我所解释的,将$factor 的值从0.9 调整为0.4 解决了这个问题。所以,问题不在于未压缩数据的大小,而是gzinflate(临时)在工作时分配的内存大小。
  • @feklee 是,问题不是剩余内存计算错误,而是gzinflate 使用的内存比您预期的要多。
  • 不是您问题的答案,但可以选择移至命令行吗?内存限制不适用于那里。

标签: php gzip out-of-memory


【解决方案1】:

确实有可能。恕我直言,问题在于memory_get_usage(true)

使用true 应该给出更高的内存使用值,因为应该考虑到所有因素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    相关资源
    最近更新 更多