これらすべての組み合わせを望んでいますが、メモリが不足しています。スクリプトからメモリを解放するには?
use strict;
use warnings;
use Algorithm::Combinatorics 'variations_with_repetition';
my @let = qw/ A G C T /;
my @cad = variations_with_repetition(\@let, 24);
print "@$_\n" for @cad;
ベストアンサー1
解決策は単にを使用することですiterators
。結果をvariations_with_repetition
スカラーに割り当てると、次の要素を取得するために毎回クエリできるイテレータが生成されます。これにより、リスト全体をメモリに保存する必要がなくなり、最初の要素にすぐにアクセスできます。という素敵なコンセプトです。怠惰な評価。あなたのケースのコードは次のとおりです。
use strict;
use warnings;
use Algorithm::Combinatorics 'variations_with_repetition';
my @let = qw / A G C T/;
my $cad = variations_with_repetition(\@let,24);
while(my $c = $cad->next)
{
print "@$c\n";
}
イテレータは実際に配列への参照を返します。まず、これを逆参照してから組み合わせるか、必要な操作を実行する必要があります。
テスト結果:私は私のコンピュータで初期コードを実行することはできませんでした(メモリの使用量は予想通り無限に増加しました)、Perlはメモリをほとんど消費しない間、イテレータを使用してすぐに出力ラインを取得し始めました。