2012-01-03 6 views
4

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モジュールに問題があることを示唆していますか?

+1

ファイルに改行がありますか?行を読み込もうとすると、ファイル全体が読み込まれる可能性があります。 – ikegami

+1

@ikegamiはいファイルに改行があり、各行の長さは255文字以内です。 –

+1

私は、空行ブロックの代わりに読み込んだ行ごとにprintステートメントを置くことを推奨します。したがって、行が実際に読み取られていることがわかります。単に ""を印刷してください。するだろう。また、ファイル全体を読む$ lineではなく、@lineを本当に使っていることを確認してください。 –

答えて

1

私はちょっと違うかもしれませんが、自分の疑問に答えるつもりです。ユニコードファイルを読み込む代わりに、Win32 :: Unicode :: FileパッケージをPath :: Class :: Unicodeパッケージに置き換えました。これはうまくいきます(つまり、メモリを食べていない)ので、Win32 :: Unicode :: Fileパッケージに問題があるようで、おそらくバグです。私はパッケージの作者に連絡し、彼はそれを調べています。あなたが私にコードを提供したいのであれば教えてください。それはかなり簡単です。

1

多分$ /(または$ INPUT_RECORD_SEPARATOR)は新しい行ではありませんか? または$ [(最初の配列要素のインデックスと(サブ)文字列の最初の文字)は0ではありません。

これらの2つの変数は、読み取りまたは読み取り時にモジュールによって使用されます。

BTW:3つの関数呼び出しを使用して各行を一度に1文字ずつ読み込み、読み込み文字ごとにEncode :: decodeを呼び出し、readlineがコードに返すラインバッファに追加するため、時間がかかる。ヤク!

+0

私は同意します。 –

関連する問題