2016-12-08 71 views
0

我這樣做是爲了運行一個外部命令,在前面加上一些數據,並把它們發送到另一個外部命令:兩個外部進程之間的管道是否可以節省內存?

my $prepend = 'foo foo foo'; 
my $contents = `command`; 
open(my $handle, "|-", "command_2")) 
print $handle $prepend . $contents; 
close $handle; 

這是罰款時$contents(從外部過程返回)小(這是較少比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的輸出的全部內容讀入內存。在第二種情況下,你一次只讀一行。

如果命令的輸出很大,並且由許多行組成,那麼是的,您將節省內存。

在第二種情況下還有更多工作要做,所以它會變慢,但可能並不明顯。

相關問題