1

1つのperlプログラムで28個のファイルを使用しています。
各ファイルのサイズは約2Mbです。
私はそれらを28のアレイに入れました。28個の出力ファイルに印刷します。
各出力ファイルには、現在のファイル配列を除いて、連結されたすべての配列が含まれています。11個の出力ファイルの後、それぞれ約70 MBのサイズ、 メモリ不足!msgが来ています。メモリ制限を増やす方法。

私が試したのは
、データを配列にフェッチした後、各ファイルハンドラーを閉じたことです。しかし、役に立たない....解決策を提案してください。

4

1 に答える 1

7

4つのファイルがあるとすると、4つのファイルA B C Dを作成して、
ファイル1にが含まれB C D
ファイル2に含まれA C D
ファイル3に含まれA B D
ファイル4にが含まれるようにしますA B C

現在行っているのは、すべてのファイルを配列にロードし(文字列を使用するだけで少しメモリを節約できます)、各出力ファイルを連続して出力することです。

また、すべての出力ファイルを開いてから、各入力ファイルを順番に開いて、対応しないすべての出力ファイルに出力することもできます。これにより、常に1つのファイルのみがメモリに保持されます。

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
于 2012-11-23T14:00:56.533 に答える