У меня есть пример последовательности ДНК, такой как: S = ATGCGGGCGTGCTGCTGGGCTGCT....
длиной 5 МБ.Кроме того, у меня есть координаты гена для каждого гена, например:
Gene no. Start End
1 1 50
2 60 100
3 110 250
.....
4000 4640942 4641628
Моя цель - выполнить определенный расчет для каждой начальной позиции гена.Мой код работает отлично.Тем не менее, это довольно медленно.Я просмотрел много страниц справки, чтобы ускорить его с помощью потоков, но, к сожалению, не смог понять.
Вот краткий обзор моего кода:
foreach my $gene($sequence){
my @coordinates = split("\t",$gene);
$model1 = substr($sequence, $coordinates[1], 50);
$model2 = substr($sequence, $coordinates[1], 60);
$c-value = calculate($model1, $model2);
....
}
sub calculate {
......
}
Я был бы очень признателен, если бы кто-нибудь смогподскажите как распараллелить такого рода программы.То, что я хочу распараллелить, - это вычисление значения c между model1 и model2 для каждого гена, что в конечном итоге ускорит процесс.Я пытался использовать Threads :: queue, но закончилось кучей ошибок.Я довольно новичок в программировании на Perl, поэтому любая помощь высоко ценится.
Спасибо всем за ваши комментарии и предложения.Я изменил код, и он, кажется, работает с использованием модуля Perl Parallel :: ForkManager.Код успешно использует все 4 ядра моего компьютера.
Вот модифицированный код:
use strict;
use warnings;
use Data::Dumper;
use Parallel::ForkManager;
my $threads = 4;
my $pm = new Parallel::ForkManager($threads);
my $i = 1; #gene number counter
$pm -> run_on_finish( sub { $i++; print STDERR "Checked $i genes" if ($i % $number_of_genes == 0); } );
my @store_c_value = ();
foreach my $gene($sequence){
my $pid = $pm->start and next;
my @coordinates = split("\t",$gene);
my $model1 = substr($sequence, $coordinates[1], 50);
my $model2 = substr($sequence, $coordinates[1], 60);
my $c-value = calculate($model1, $model2);
push(@store_c_value, $c-value);
$i++;
$pm->finish;
}
$pm->wait_all_children;
sub calculate {
......
return ($c-value);
}
print Dumper \@store_c_value;
В настоящее время я не получаю вывод для @store_c_value
(т. Е. Пустой массив).Я обнаружил, что вы не можете сохранить данные из дочернего процесса в массив, который был объявлен в основной программе.Я знаю, что могу напечатать его во внешний файл, но я хочу, чтобы эти данные были в массиве @store_c_value
, так как я использую их позже в программе.
Еще раз спасибо за помощь.