Как устранить неполадки очень медленного сценария Perl, который работает быстрее на одном сервере, но медленно на другом - PullRequest
2 голосов
/ 18 сентября 2019

Я получил скрипт 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;
}

1 Ответ

3 голосов
/ 19 сентября 2019

Невозможно рассказать, не зная намного больше о проблеме, в первую очередь о размере структур данных и обрабатываемого файла.

Вот общий комментарий к тому, что в принципебыть наиболее трудоемкими операциями в том, что, по-видимому, выполняет код, в (возможно) убывающем порядке важности и / или вероятности

  • Насколько велик файл?Это доступ к диску, который может занять любое время

  • Сортировка в цикле - насколько велики данные, которые сортируются?A sort отнимает много времени

  • Вокруг @sorted существует тот "танец чечетки", который приводит к копированию данных - сколько данных?

  • Как правило, копирование данных происходит очень часто - насколько велико @targets, переданное в процедуру?

Как вы можете видетькаждый фактор связан с вопросом о том, насколько велики данные.Доступ к диску, конечно, дорогостоящий, но большое значение имеет копирование данных между различными структурами данных в программе.

Так что, если вы можете предоставить некоторые подробности, которые помогут нам дать вам более подробный анализ /думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...