内存不足! Perl的

时间:2012-11-23 13:01:11

标签: perl

我在一个perl程序中使用了28个文件 每个文件大小约为2Mb 我已将它们带入28个阵列。并打印28个输出文件 每个输出文件包含连接的所有数组,当前文件数组除外。 输出11个文件后,每个大小约70 MB, 内存不足! msg即将推出。 如何增加内存限制。

我尝试的是:
我在将数据提取到数组后关闭了每个文件处理程序。但没有用...... 请提出解决方案。

1 个答案:

答案 0 :(得分:7)

假设您有四个文件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