2016-12-08 5 views
0

2つの外部プロセス間の配管はメモリを節約しますか?私は、外部コマンドを実行するためにこれをやって、先頭に追加いくつかのデータと別の外部コマンドにすべてを送った

(外部プロセスから返された) $contentsが小さい場合(それは多くの場合、あまりだの罰金です
my $prepend = 'foo foo foo'; 
my $contents = `command`; 
open(my $handle, "|-", "command_2")) 
print $handle $prepend . $contents; 
close $handle; 

1kよりも大きい)が、大きければ(10,20,30MBまで)、これは不必要にメモリを消費すると思われます。

だから私はそれを変更:

my $prepend = 'foo foo foo'; 
open(my $handle_in, "-|", "command")) 
open(my $handle_out, "|-", "command_2")) 
print $handle_out $prepend; 
while (<$handle_in>) { 
    print $handle_out $_; 
} 
close $handle_in; 
close $handle_out; 

これは実際にはメモリを節約していますか? commandが多くのMBのデータを返すと、パフォーマンスに問題がありますか?これを行うより良い方法はありますか?

+0

'File :: Copy'を使用して、入力を出力ファイルハンドルにコピーすることができます。 http://perldoc.perl.org/File/Copy.html – shawnhcorey

+0

@shawnhcoreyありがとう。それはバッファーサイズのコントロールを持っているようにも見えます。私がやりとったことの間に本当の違いがあるかどうか知っていますか?それはおそらく同じですか、それとも最適化されていますか? – messy

+0

'File :: Copy'は標準モジュールであり、Perlとともにインストールされます。標準モジュールを最適化することができれば、それらは通常あります。 – shawnhcorey

答えて

0

最初のケースでは、commandの出力全体をメモリに読み込んだ後に出力します。 2番目のケースでは、一度に1行だけを読み込みます。

コマンドの出力が大きく、多くの行で構成されている場合は、メモリを節約できます。

2番目のケースではもっと多くの作業が行われるため、処理速度は遅くなりますが、目立たないほどです。

関連する問題