Я получил скрипт perl, который должен фильтровать зонды для данных Hi-C, но он работает слишком медленно (несколько дней).Тот, кто дал мне сценарий, сказал мне, что на сервере ее предыдущей лаборатории потребовалось всего несколько часов, так что мне интересно, что может вызвать такую разницу во времени выполнения, и как я могу заставить его работать быстрее?Мои знания Perl очень ограничены, но мой поиск в Google пока подсказывает, что мне может понадобиться изменить некоторые файлы конфигурации Perl?Ниже приведена основная функция во всем сценарии, которая занимает больше всего времени, входной файл содержит цели и местоположения хромосом.Любая помощь будет принята с благодарностью!
Я попытался запустить с Perl 5.16 и 5.26, чтобы увидеть, может быть, версия слишком старая, но это заняло столько же времени.
sub get_restriction_fragments_for_targets {
my @targets = @_;
# Split by chromsome and sort
my %targets;
foreach my $target (@targets) {
push @{$targets{$target->{chr}}},$target;
}
foreach my $chr (keys %targets) {
my @sorted = sort {$a -> {start} <=> $b -> {start}} @{$targets{$chr}};
# We also need to merge overlapping capture regions
my @merged;
my $last_region;
foreach my $region (@sorted) {
unless ($last_region) {
$last_region = $region;
next;
}
if ($region->{start} < $last_region -> {end}) {
# Merge
if ($region ->{end} > $last_region->{end}) {
$last_region->{end} = $region->{end};
}
next;
}
push @merged,$last_region;
$last_region = $region;
}
push @merged,$last_region;
$targets{$chr} = \@merged;
}
my @target_fragments;
open (IN,'all_restriction_fragments.txt') or die $!;
my $last_chr = "";
my $last_index = 0;
while (<IN>) {
chomp;
my $line = $_;
my ($chr,$start,$end) = split(/\t/);
if ($chr ne $last_chr) {
warn "Moving to $chr\n";
$last_chr = $chr;
$last_index = 0;
}
next unless (exists $targets{$chr});
my @local_targets = @{$targets{$chr}};
foreach my $index ($last_index .. $#local_targets) {
my $target = $local_targets[$index];
if ($target -> {end} < $start) {
$last_index = $index;
next;
}
if ($target -> {start} > $end) {
last;
}
push @target_fragments,{
id => $target->{id},
chr => $chr,
start => $start,
end => $end,
};
last;
}
}
return @target_fragments;
}