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
検索したら結構メジャーなトラブルっぽかった