Windows XPのStrawberry perl 5.12.3.0で次のコードを実行すると、問題が見つかります。シンプルなWin32 :: Unicode :: File readlineループとStrawberry Perlを使用した「メモリ不足」
#!/usr/bin/perl -w
use strict;
use warnings;
use Win32::Unicode::File;
use Encode;
my $fname = shift @ARGV;
my $fh = Win32::Unicode::File->new;
if ($fh->open('<', $fname)){
while (my $line = $fh->readline()){}
close $fh;
}else{
print "Couldn't open file: $!\n";
}
ここで起こっている唯一のことは、私はreadlineのを実行すると、私はストロベリーperlのからメモリ不足エラーを取得するまで、これはメモリを食べ続けることです。私は本当に大きなファイルを使用していますが、このコードはストリームに基づいているので問題ではありません。私はここで何かを見逃しているのですか、それともストロベリー・パールのどこかにリークがありますか? ActivePerlで全く同じコードをテストしたところ、正常に動作します。つまり、メモリを消費しません。
更新:通常のダイヤモンド演算子でWin32 :: Unicode :: Fileを置き換えると、少なくとも私のディストリビューションで動作するようです。次のコードを参照してください。
use strict;
use warnings;
my $fname = shift @ARGV;
if (open(my $fh, '<', $fname)){
while (my $line = <$fh>){}
close $fh;
}else{ print "Couldn't open file: $!\n";}
これは、Win32 :: Unicodeモジュールに問題があることを示唆していますか?
ファイルに改行がありますか?行を読み込もうとすると、ファイル全体が読み込まれる可能性があります。 – ikegami
@ikegamiはいファイルに改行があり、各行の長さは255文字以内です。 –
私は、空行ブロックの代わりに読み込んだ行ごとにprintステートメントを置くことを推奨します。したがって、行が実際に読み取られていることがわかります。単に ""を印刷してください。するだろう。また、ファイル全体を読む$ lineではなく、@lineを本当に使っていることを確認してください。 –