gzinflate:max。避免内存不足的空间?
问题描述:
当使用gzinflate
进行解压缩时,我发现 - 在某些 的情况下 - 以下代码会导致内存不足错误。在32位Linux上使用PHP 5.3.20测试(Amazon Linux AMI,在EC2上)。gzinflate:max。避免内存不足的空间?
$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
足够的内存,我仍然得到:
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 266143484 bytes) in foo.php on line 123
当改变的$factor
从0.9
价值0.4
,则误差变在这种情况下。在其他情况下0.9
是可以的。
我在想:
是对真正的错误gzinflate
需要两倍多的未压缩数据的空间更多的原因是什么?是否有其他原因? $remaining
真的是剩下的应用程序内存吗?
答
确实有可能。恕我直言,问题在于memory_get_usage(true)
。
使用true
应该提供更高的内存使用量值,因为应该将所有内容都考虑在内。
你是什么'gzinflate()'在这么大的第一个地方? – 2013-03-02 12:27:14
'gzinflate'可能会将内存分配给临时数据块。你应该阅读它的实现。 – Tchoupi 2013-03-02 12:31:17
PHP不是C,你不能真正期待'gzinflate'和PHP不需要超过未压缩字符串的大小(即使你留有空白)。另外,PHP在内存方面相当松散,这可能是正常的行为。 – Mahn 2013-03-02 12:32:36