Intereting Posts
отображение неправильных строк в консоли ssh Как сделать USB-накопитель незаметным в u-boot? Получение «zsh: command not found: time» при запуске `time` в подселле XF86MonBrightnessUp / XF86MonBrightnessНастоящие специальные клавиши не работают Итерация через подкаталоги и выполнение awk-скрипта для определенных файлов .xsession и .xinitrc не выполняются при входе в систему bash alias, начинающийся с pipe, не работает? Как выполнить итерацию команды с двумя разными переменными? Что делает параметр -f в команде tar что означает * – * – c – * – * – * значение в настройке шрифта Совместить отсутствующие значения в текстовых файлах Можно ли установить CentOS и некоторые пакеты, а затем положить весь результат в installable iso? Сообщение Emacs: сохранить отправленные письма Как сделать отказоустойчивость HA Heartbeat, когда потеряно одно из двух соединений NIC? Не удалось выполнить перенаправление в среде chroot

Освободить память в perl-скрипте

Я хочу все эти комбинации, но у меня недостаточно памяти. Как я могу освободить память в моем сценарии?

use strict; use warnings; use Algorithm::Combinatorics 'variations_with_repetition'; my @let = qw/ AGCT /; 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 / AGCT/; my $cad = variations_with_repetition(\@let,24); while(my $c = $cad->next) { print "@$c\n"; } 

Просто обратите внимание, что итератор фактически возвращает ссылку на массив, который вы должны сначала разыменовать, а затем присоединиться или выполнить любую операцию, которая вам нравится.

Результаты тестирования: я не мог запустить исходный код на своей машине (использование памяти растет неопределенно, как и ожидалось), но с использованием итераторов я сразу же начал получать выходные строки, причем perl вряд ли потреблял какую-либо память.

Ну, перечисление слов, написанных на алфавите (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 добавляет достаточное количество нулей, чтобы сделать число печати 24 цифры;

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