Perl Language
メモリ使用量の最適化
サーチ…
ファイルを読む:foreachとwhile
潜在的に大きなファイルを読み込む場合、 while
ループはforeach
比べてメモリのメリットが大きくなります。以下は、レコードによって、ファイルレコードを読み込みます(デフォルトでは、「レコードは」で指定された「行」、意味$/
各1割り当てる) $_
、それが読まれるよう:
while(<$fh>) {
print;
}
ダイヤモンド演算子は、ループが "0"文字だけを含む行末ではなく、ファイルの終わりで終了することを確認するためにここでいくつかの魔法を使います。
次のループはまったく同じように見えますが、リストコンテキストでダイヤモンド演算子を評価して、ファイル全体を一度に読み取ることができます。
foreach(<$fh>) {
print;
}
とにかく一度に1つのレコードで操作していると、膨大なメモリが浪費され、回避する必要があります。
長いリストの処理
あなたが既にメモリにリストを持っているなら、それを処理する簡単で通常十分な方法は簡単なforeach
ループです:
foreach my $item (@items) {
...
}
これは$item
何らかの処理を行い、データを保存せずにファイルに書き出すという一般的なケースでは問題ありません。ただし、アイテムから他のデータ構造を構築した場合、 while
ループはメモリ効率が向上します。
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
$item
への参照が結果リスト内で直接終了しない限り、 @items
配列からシフトした項目は解放され、次のループの繰り返しを入力するとインタプリタによってメモリが再利用されます。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow