大きなバイナリファイル(500MB)を読み込み、5000バイトごとに繰り返されるヘッダの後にある特定のバイトをフェッチします。そのため、バイナリモードで16536のブロックサイズで短いスニペットを読み込んでいます。perlでバイナリファイルを読む - メモリ不足
コードは意図したとおりに動作しますが、使用できないメモリをすべて使い果たしてしまいます。私は閉じて、書き込み操作を行う必要があるたびに私が書き込む解析された出力ファイルを開くことを試みたが、それは役に立たない。この問題は、私がバイナリファイルを読んでいる方法にリンクできますか?メモリは、メモリに保持されているものです食べる事 - 最初のオフ、
use strict;
my $BLOCK_SIZE=16536;
my $fname = $ARGV[0];
my $fparsename = $ARGV[1];
open(F,"<$fname") or die("Unable to open file $fname, $!");
binmode(F);
my $buf;
my $ct=0;
my $byte=0;
my $byte_old=0;
my $byte_cnt=0;
my $byte_lock=0;
my $sample_msb=0;
my $sample_lsb=0;
my $sample_16b=0;
my $out_form='';
open(my $fh, '>', $fparsename) or die "Could not open file '$fparsename' $!";
print $fh ("Sample, Value \n");
close($fh);
while(read(F,$buf,$BLOCK_SIZE,$ct*$BLOCK_SIZE)){
foreach(split(//, $buf)){
$byte_old = $byte;
$byte = ord($_); # fetch byte (in decimal)
if (($byte_old == 202) && ($byte == 254)) { # CA = 202, FE = 254
$byte_cnt = 0;
$byte_lock = 1;
}
if ($byte_lock == 1) {
$byte_cnt++;
}
if ($byte_cnt == 20) { # 20th byte after CAFE in header
$sample_msb = $byte;
}
if ($byte_cnt == 21) { # 21th byte after CAFE in header
$sample_lsb = $byte;
}
if (($byte_cnt == 21) && ($byte_lock == 1)) { # lock down and concatenate
$byte_lock = 0;
$byte_cnt = 0;
$sample_16b = sprintf("%X", $sample_msb) . sprintf("%X", $sample_lsb);
$out_form = sprintf("%d, %s \n", $ct++, $sample_16b);
open(my $fh, '>>', $fparsename) or die "Could not open file '$fparsename' $!";
printf $fh $out_form;
close($fh);
}
}
$ct++;
}
close(F);
close($fh);
ではなく小数を使用して、それらに 'CA = 202のコメントを、FEは= 254'は' 0xCA'を使用する必要がありますし、 '0xFE'。 – Borodin