Perl

在 perl 腳本中釋放記憶體

  • April 22, 2015

我想要所有這些組合,但我沒有足夠的記憶體。如何釋放腳本中的記憶體?

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;

解決方案是簡單地使用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 幾乎不消耗任何記憶體。

引用自:https://unix.stackexchange.com/questions/197731