Ошибка при использовании Perl-модуля Parallel :: ForkManager - PullRequest
0 голосов
/ 30 июня 2018

Я получаю следующее сообщение об ошибке при использовании Perl-модуля Parallel :: ForkManager и не могу понять, что не так в моем коде.

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

Любая помощь будет очень признательна.

Большое спасибо. :)

Вот ошибки:

Не удается выполнить ветвь: невозможно выделить память в /usr/local/perl-5.24.0/lib/site_perl/5.24.0/Parallel/ForkManager.pm строка 52, строка 8260.

Сохраняемому модулю не удалось сохранить дочернюю структуру данных во временном файле "/tmp/1341650.1.longjob.q/dZnCgF1MiR/Parallel-ForkManager-28852-28855.txt": невозможно создать /tmp/1341650.1. longjob.q / dZnCgF1MiR / Parallel-ForkManager-28852-28855.txt: Нет такого файла или каталога в /usr/local/perl-5.24.0/lib/site_perl/5.24.0/Parallel/ForkManager.pm строка 84.

Вот мой код:

if ($threads == 1) {
    for my $id (0 .. $nbInputFiles) {
        $self->{$id}->{_currentFile} = $self->{inputFiles}[$id] ;
        $self->readBamInputFile($id) ;
        $self->correctMatrice($id) ;
        print STDERR "INFO $prog $datestring: $self->{$id}->{_currentFile} -> correcting matrice done !\n" ;
    }
}
else {
    my $pm = new Parallel::ForkManager($threads);
    $pm->set_waitpid_blocking_sleep(0);

    $pm->run_on_finish(sub {
        my ($pid, $exit, $id, $signal, $core, $data) = @_;

        $self->{$id}->{cov} = $data->{ret}->{$id}->{cov} ;
        $self->{$id}->{_currentSample} = $data->{ret}->{$id}->{_currentSample} ;
        $self->correctMatrice($id) ;
        print STDERR "INFO $prog $datestring: $data->{ret}->{$id}->{_currentFile} -> correcting matrice done !\n" ;

        $ret[$id] = delete $data->{ret};
        $err[$id] = delete $data->{err};
    });

    for my $id (0 .. $nbInputFiles) {
        $self->{$id}->{_currentFile} = $self->{inputFiles}[$id] ;
        $pm->start($id) and next;

        # here do the child
        # my $res = eval { $task[0]->($self) };
        my $res = eval { &readBamInputFile($self, $id) };
        $pm->finish(0, { ret => $self, err => $@ });
    }
    $pm->wait_all_children;
}

1 Ответ

0 голосов
/ 30 июня 2018

Звучит так, как будто диск /tmp переполнен, или есть какие-то проблемы с разрешением, или какой-то процесс очищает его за вашей спиной.

Попробуйте использовать другой каталог для временного файла.

Для этого установите переменную среды TMPDIR или передайте имя каталога в качестве второго аргумента конструктору:

Parallel::ForkManager->new($max_process, $tmp_dir_qfn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...