Arrays Perl:STDOUT/shell命令直接输出到数组

Arrays Perl:STDOUT/shell命令直接输出到数组,arrays,perl,shell,system,stdout,Arrays,Perl,Shell,System,Stdout,我必须访问Perl脚本中的shell命令配置单元,所以我使用“…”。 假设“蜂巢……”的结果包含100000000行,大小为20GB。 我想要实现的是: @array = `hive ... ...`; ``是否自动知道使用“\n”作为分隔符将每一行分割成@数组 我能想到的两种方法是(但在这种情况下有问题): 这种方法的问题是,如果在这种情况下,配置单元的输出太大,$temp无法存储输出,从而导致分段错误核心转储 或 蜂巢。。。1> temp.txt`; 开放式(FP, 实际上,将命令的每一行

我必须访问Perl脚本中的shell命令配置单元,所以我使用“…”。 假设“蜂巢……”的结果包含100000000行,大小为20GB。 我想要实现的是:

@array = `hive ... ...`;
``是否自动知道使用“\n”作为分隔符将每一行分割成@数组

我能想到的两种方法是(但在这种情况下有问题):

这种方法的问题是,如果在这种情况下,配置单元的输出太大,$temp无法存储输出,从而导致分段错误核心转储

蜂巢。。。1> temp.txt`;
开放式(FP,
实际上,将
命令
的每一行输出放入自己的
@array
元素中。无需将输出加载到标量中,然后自己将其拆分

但是存储在一个数组中的20GB的输出(由于Perl存储数据的方式,可能是这个数量的2-3倍)仍然会给系统带来可怕的压力

问题的真正解决方案是通过IO句柄将命令的输出流化,一次只处理一行,而不必一次将所有输出加载到内存中。方法是使用Perl的
open
命令:

open my $fh, "-|", "command";
open my $fh, "command |";
命令后附加的
-
文件模式或
告诉Perl运行外部命令,并使该命令的输出在文件句柄
$fh
中可用

现在迭代filehandle,一次接收一行输出

while (<$fh>) {
    # one line of output is now in $_
    do_something($_);
}
close $fh;
while(){
#现在有一行输出正在运行$_
做某事($);
}
收盘价$fh;
实际上,将
命令
的每一行输出放入自己的
@array
元素中。无需将输出加载到标量中,然后自己将其拆分

但是存储在一个数组中的20GB的输出(由于Perl存储数据的方式,可能是这个数量的2-3倍)仍然会给系统带来可怕的压力

问题的真正解决方案是通过IO句柄将命令的输出流化,一次只处理一行,而不必一次将所有输出加载到内存中。方法是使用Perl的
open
命令:

open my $fh, "-|", "command";
open my $fh, "command |";
命令后附加的
-
文件模式或
告诉Perl运行外部命令,并使该命令的输出在文件句柄
$fh
中可用

现在迭代filehandle,一次接收一行输出

while (<$fh>) {
    # one line of output is now in $_
    do_something($_);
}
close $fh;
while(){
#现在有一行输出正在运行$_
做某事($);
}
收盘价$fh;
实际上,将
命令
的每一行输出放入自己的
@array
元素中。无需将输出加载到标量中,然后自己将其拆分

但是存储在一个数组中的20GB的输出(由于Perl存储数据的方式,可能是这个数量的2-3倍)仍然会给系统带来可怕的压力

问题的真正解决方案是通过IO句柄将命令的输出流化,一次只处理一行,而不必一次将所有输出加载到内存中。方法是使用Perl的
open
命令:

open my $fh, "-|", "command";
open my $fh, "command |";
命令后附加的
-
文件模式或
告诉Perl运行外部命令,并使该命令的输出在文件句柄
$fh
中可用

现在迭代filehandle,一次接收一行输出

while (<$fh>) {
    # one line of output is now in $_
    do_something($_);
}
close $fh;
while(){
#现在有一行输出正在运行$_
做某事($);
}
收盘价$fh;
实际上,将
命令
的每一行输出放入自己的
@array
元素中。无需将输出加载到标量中,然后自己将其拆分

但是存储在一个数组中的20GB的输出(由于Perl存储数据的方式,可能是这个数量的2-3倍)仍然会给系统带来可怕的压力

问题的真正解决方案是通过IO句柄将命令的输出流化,一次只处理一行,而不必一次将所有输出加载到内存中。方法是使用Perl的
open
命令:

open my $fh, "-|", "command";
open my $fh, "command |";
命令后附加的
-
文件模式或
告诉Perl运行外部命令,并使该命令的输出在文件句柄
$fh
中可用

现在迭代filehandle,一次接收一行输出

while (<$fh>) {
    # one line of output is now in $_
    do_something($_);
}
close $fh;
while(){
#现在有一行输出正在运行$_
做某事($);
}
收盘价$fh;

非常感谢。我试过你的方法。只是担心高内存消耗和将20gb放入ram仍然非常慢。这种方法非常好、快速和低内存使用率。非常感谢。我试过你的方法。只是担心高内存消耗和将20gb放入ram仍然非常慢。这种方法非常好、快速和低内存使用率y使用。非常感谢。我尝试过你的方法。只是担心高内存消耗和将20gb放入ram仍然是非常缓慢的。方法非常好,快速和低内存使用。非常感谢。我尝试过你的方法。只是担心高内存消耗和将20gb放入ram仍然是非常缓慢的。方法非常好,快速和低内存使用粗制滥造的用法。