我在一个 perl 程序中使用了 28 个文件。
每个文件大小约为 2Mb。
我已将它们放入 28 个数组中。并打印 28 个输出文件。
每个输出文件都包含所有连接的数组,当前文件数组除外。11 个输出文件后,每个大约 70 MB 大小,
内存不足!味精来了。如何增加内存限制。
我尝试的是:
将数据提取到数组后,我关闭了每个文件处理程序。但没有用....请提出解决方案。
我在一个 perl 程序中使用了 28 个文件。
每个文件大小约为 2Mb。
我已将它们放入 28 个数组中。并打印 28 个输出文件。
每个输出文件都包含所有连接的数组,当前文件数组除外。11 个输出文件后,每个大约 70 MB 大小,
内存不足!味精来了。如何增加内存限制。
我尝试的是:
将数据提取到数组后,我关闭了每个文件处理程序。但没有用....请提出解决方案。
假设您有四个文件A B C D
,然后您想创建四个文件,以便
文件 1 包含B C D
、
文件 2 包含A C D
、
文件 3 包含A B D
、
文件 4 包含A B C
。
您当前正在做的是将每个文件加载到一个数组中(仅使用字符串会节省一点内存),然后连续打印每个输出文件。
您也可以打开所有输出文件,然后依次打开每个输入文件并将其打印到每个不对应的输出文件中。这在任何时候都只会在内存中保留一个文件。
use strict; use warnings;
my @in = qw(A B C D);
my @out = qw(1 2 3 4);
my @outhandles = map {open my $fh, ">", $_ or die $!; $fh} @out;
for my $i (0 .. $#in) {
open my $fh, "<", $in[$i] or die $!;
my $content = do {local $/; <$fh>};
for my $j (0 .. $#outhandles) {
print {$outhandles[$j]} $content unless $i == $j;
}
}
如果您说print {$outhandles[$j]} $_ while <$fh>
而不是吞食输入文件,则可以进一步减少内存。
$ mkdir test; cd test;
$ for file in {A..D}; do echo $file >$file; done
$ perl ../script.pl
$ ls
1 2 3 4 A B C D
$ for file in `ls`; do echo == $file; cat $file; done
== 1
B
C
D
== 2
A
C
D
== 3
A
B
D
== 4
A
B
C
== A
A
== B
B
== C
C
== D
D