循环错误中的perl文件句柄
perl filehandles in loop error
尝试根据文件中存在的匹配将 fastq 文件拆分为多个文件,因此输出文件可能超过 500 个。提供两个输入文件 - 一个用于匹配,另一个用于其他内容 (fastq)。将匹配放在不同的文件中。此代码完美运行,但不能创建超过 502 个文件。上面502,说不能制作文件。那是循环中文件句柄的限制吗?我需要一次创建 > 502 个文件。任何解决方案?谢谢
my @fh_array;
foreach(@file_names){
chomp $_;
local *OUT;
open (OUT, ">", "$_\.txt") or die "cannot write file";
push @fh_array, *OUT;
}
# In for loop, it works
print $fh_array[0] "Hello";
我认为这不是 Perl 问题。我运行它有1000个文件,没问题。每个进程可以使用 ulimit 显示(并可能设置)打开的文件数。
虽然您的系统可能存在限制,无法同时打开如此多的文件句柄,但事实上这是一种没有必要或非常实用的蛮力解决方案。我敢打赌,如果您只是在需要时打开一个文件,而不是一次打开所有文件,您将不会注意到明显的性能差异。
例如:
write_to_file($file, @lines);
sub write_to_file {
my ($file, @lines) = @_;
open my $fh, ">>", $file or die "Cannot open file '$file' for appending: $!";
print $fh @lines;
}
伪文件句柄不计入打开文件句柄的系统限制。根据您的内存要求,将输出写入内存然后在脚本末尾将内存写入磁盘(一次一个文件)可能是可行的。
例如:
my (@fh_array, %output);
foreach my $file_name (@file_names) {
$output{$file_name} = '';
open my $fh, '>', $output{$file_name};
push @fh_array, $fh;
}
# main part of program, print to handles in @fh_array
... print {$fh_array[185]} "Hello\n" ...
# end of program. Copy from memory to disk with one open fh at a time
close $_ for @fh_array;
foreach my $file_name (keys %output) {
open my $fh, '>', $file_name;
print $fh $output{$file_name};
close $fh;
}
几乎肯定有更好的方法来设计您的程序,而不必同时打开如此多的文件句柄或具有这种额外的复杂性。
尝试根据文件中存在的匹配将 fastq 文件拆分为多个文件,因此输出文件可能超过 500 个。提供两个输入文件 - 一个用于匹配,另一个用于其他内容 (fastq)。将匹配放在不同的文件中。此代码完美运行,但不能创建超过 502 个文件。上面502,说不能制作文件。那是循环中文件句柄的限制吗?我需要一次创建 > 502 个文件。任何解决方案?谢谢
my @fh_array;
foreach(@file_names){
chomp $_;
local *OUT;
open (OUT, ">", "$_\.txt") or die "cannot write file";
push @fh_array, *OUT;
}
# In for loop, it works
print $fh_array[0] "Hello";
我认为这不是 Perl 问题。我运行它有1000个文件,没问题。每个进程可以使用 ulimit 显示(并可能设置)打开的文件数。
虽然您的系统可能存在限制,无法同时打开如此多的文件句柄,但事实上这是一种没有必要或非常实用的蛮力解决方案。我敢打赌,如果您只是在需要时打开一个文件,而不是一次打开所有文件,您将不会注意到明显的性能差异。
例如:
write_to_file($file, @lines);
sub write_to_file {
my ($file, @lines) = @_;
open my $fh, ">>", $file or die "Cannot open file '$file' for appending: $!";
print $fh @lines;
}
伪文件句柄不计入打开文件句柄的系统限制。根据您的内存要求,将输出写入内存然后在脚本末尾将内存写入磁盘(一次一个文件)可能是可行的。
例如:
my (@fh_array, %output);
foreach my $file_name (@file_names) {
$output{$file_name} = '';
open my $fh, '>', $output{$file_name};
push @fh_array, $fh;
}
# main part of program, print to handles in @fh_array
... print {$fh_array[185]} "Hello\n" ...
# end of program. Copy from memory to disk with one open fh at a time
close $_ for @fh_array;
foreach my $file_name (keys %output) {
open my $fh, '>', $file_name;
print $fh $output{$file_name};
close $fh;
}
几乎肯定有更好的方法来设计您的程序,而不必同时打开如此多的文件句柄或具有这种额外的复杂性。