4

で解凍するとgzinflate、特定の状況下で、次のコードでメモリ不足エラーが発生することがわかりました。32 ビット Linux ( EC2上のAmazon Linux AMI )で PHP 5.3.20 を使用してテスト済み。

$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はOKです。

私は疑問に思う:

エラーの理由は、gzinflate圧縮されていないデータの 2 倍以上のスペースが本当に必要なのでしょうか? 何か他に理由があるのではないでしょうか?$remaining残りのメモリは本当にアプリケーションで自由に使用できるのでしょうか?

4

1 に答える 1

1

それは確かに可能です。私見、問題はにありmemory_get_usage(true)

を使用trueすると、すべてを考慮に入れる必要があるため、より高いメモリ使用量の値が得られるはずです。

于 2013-03-23T17:01:54.603 に答える