Arrays Perl:STDOUT/shell命令直接输出到数组
我必须访问Perl脚本中的shell命令配置单元,所以我使用“…”。 假设“蜂巢……”的结果包含100000000行,大小为20GB。 我想要实现的是: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, 实际上,将命令的每一行
@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仍然是非常缓慢的。方法非常好,快速和低内存使用粗制滥造的用法。