Освободите память в сценарии жемчуга

Если необходимо использовать dash, это будет работать:

mkfifo file1
mkfifo file2
xzcat file1.xz >file1&
xzcat file2.xz >file2&
diff file1 file2
rm -f file1 file2 #remove the FIFOs
3
21.04.2015, 23:58
2 ответа

Решение заключается в простом использовании итераторов . Присваивая результаты вариации_с_повторением скаляру, он генерирует итератор, который можно опрашивать каждый раз, чтобы получить следующий элемент. Таким образом, Вы не будете хранить весь список в памяти и немедленно получите доступ к первым элементам. Это прекрасная концепция, называемая ленивой оценкой . Вот код для вашего случая:

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 практически не потреблял памяти.

2
27.01.2020, 21:27

Ну, перечисление слова, написанные на алфавите (A, G, C, T), много так же, как считая в базе четыре. Зная это (удалить звонок голова; Это только для того, чтобы усечить очень длинный вывод во время тестирования):

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

Объяснение:

  • Echo 4o - это команда, которая дает инструкции DC для вывода в базе четырех;

  • SEQ просят рассчитывать на весь диапазон, что 24-значные базы четырех номеров;

  • SED добавляет P к каждой строке, чтобы спросить DC , чтобы распечатать каждый Номер (в базе четыре, помните);

  • awk awk предъявит достаточно нулевых нулей, чтобы сделать количество печати 24 цифры;

  • TR переводит цифры (0, 1, 2, 3) в алфавит (A , G, C, T).

0
27.01.2020, 21:27

Теги

Похожие вопросы