两个外部进程之间的管道是否节省内存?

时间:2016-12-08 12:00:51

标签: perl memory

我这样做是为了运行外部命令,预先添加一些数据并将其全部发送到另一个外部命令:

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数据时,它是否会遇到任何性能问题?有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

在第一种情况下,在发送任何输出之前,您将command的整个输出读入内存。在第二种情况下,您一次只能读取一行。

如果命令的输出很大并且由许多行组成,那么是的,你将节省内存。

在第二种情况下还有更多的工作要做,所以它会慢一些,但可能不会那么明显。