Liberar memória no script perl

3

Eu quero todas essas combinações, mas não tenho memória suficiente. Como posso liberar memória no meu script?

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;
    
por zorbax 21.04.2015 / 22:58

2 respostas

2

A solução é simplesmente usar iterators . Ao atribuir os resultados de variations_with_repetition a um escalar, ele gera um iterador que você pode interrogar a cada vez para obter o próximo elemento. Ao fazer isso, você não mantém a lista inteira na memória e tem acesso aos primeiros elementos imediatamente. Este é um conceito adorável chamado avaliação lenta . Aqui está o código para o seu caso:

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";
}

Apenas observe que o iterador realmente retorna uma referência a um array que você deve primeiro desreferenciar e então entrar ou fazer qualquer operação que você goste nele.

Resultados do teste: Eu não consegui rodar o código inicial na minha máquina (o uso da memória cresce indefinidamente como esperado), mas usando iteradores, imediatamente comecei a obter as linhas de saída, com o perl consumindo memória.

    
por 22.04.2015 / 02:18
0

Bem, enumerar palavras escritas no alfabeto (A, G, C, T) é muito o mesmo que contar na base quatro. Sabendo disso (remova a chamada para cabeça; só está lá para truncar a saída muito longa durante o teste):

{ echo 4o; seq 0 $((4 ** 24 - 1)) | sed 's/$/p/'; } | dc | awk '{ printf "%024d\n", $1 }' | tr 0-4 AGCT | head

Explicação:

  • echo 4o é um comando que instrui dc a produzir na base quatro;

  • Solicita-se que
  • seq conte ao longo de todo o intervalo que o número base de quatro dígitos de 24 dígitos cobre;

  • sed acrescenta um p a cada linha para solicitar que dc imprima cada número (na base quatro, lembre-se)

  • awk adiciona zeros suficientes para que o número imprima 24 dígitos;

  • tr traduz dígitos (0, 1, 2, 3) para o alfabeto (A, G, C, T).

por 22.04.2015 / 00:21

Tags