揮発性のメモ2

http://d.hatena.ne.jp/iww/

unpackは想像以上にメモリをたくさん消費する

PHPで500KB程度のバイナリファイルを1バイトずつ処理したかったので

<?
$array = unpack("C*", file_get_contents($argv[1]));
foreach($array as $a){

みたいなコードを書いていたら、メモリが足りないというエラーが出た

$ ./hoge.php hoge.bin
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 20 bytes) in /tmp/hoge.php on line 3

なんで500KBをunpackしたら32MB超えるんだよ
と思って調べたところ、本当に超えていた

<?
ini_set('memory_limit', '128M'); // テスト用にメモリを拡張
echo("読出し前 ". memory_get_usage());

$text  = file_get_contents($argv[1]);
echo("読出し後 ". memory_get_usage());

$array = unpack("C*", $text);
echo("unpack後 ". memory_get_usage());
読出し前 117924
読出し後 618204
unpack後 38715820

(38715820-618204)/500000 = 76
概算で1バイトあたり76バイト使っている。(実際には管理領域とかあるので違うけど)
じゃあstr_split()でいこうと思ったら、もっと浪費していた。(概算92バイトくらい)

しかたがないので、1文字ずつ取り出してループするように変更

<?
$text = file_get_contents($argv[1]);
$size = strlen($text);
for($i=0; $i<$size; $i++){
    $a = ord(substr($text, $i, 1));


stackoverflow.com
検索したら結構メジャーなトラブルっぽかった