2013-03-02 65 views
4

当使用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

当改变的$factor0.9价值0.4,则误差变在这种情况下。在其他情况下0.9是可以的。

我在想:

是对真正的错误gzinflate需要两倍多的未压缩数据的空间更多的原因是什么?是否有其他原因? $remaining真的是剩下的应用程序内存吗?

+1

你是什么'gzinflate()'在这么大的第一个地方? – 2013-03-02 12:27:14

+0

'gzinflate'可能会将内存分配给临时数据块。你应该阅读它的实现。 – Tchoupi 2013-03-02 12:31:17

+1

PHP不是C,你不能真正期待'gzinflate'和PHP不需要超过未压缩字符串的大小(即使你留有空白)。另外,PHP在内存方面相当松散,这可能是正常的行为。 – Mahn 2013-03-02 12:32:36

回答

1

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

使用true应该提供更高的内存使用量值,因为应该将所有内容都考虑在内。