使用Perl模块Parallel::ForkManager时出错

bihw5rsg  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(199)

当我使用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/dZnCgF 1 MiR/并行派生管理器-28852-28855.txt:在/usr/local/perl-5.24.0/lib/site_perl/5.24.0/Parallel/ www.example.com的第84行没有这样的文件或目录ForkManager.pm。
下面是我的代码:

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;
}
yx2lnoni

yx2lnoni1#

用array ref Package 它对我很有效。

$pm->finish(0, [{x=>1}]);
agxfikkp

agxfikkp2#

听起来像是/tmp驱动器已满,或者存在某些权限问题,或者某个进程正在背后清理它。
请尝试使用其他目录存放临时文件。
为此,请设置环境变量TMPDIR,或将目录名作为第二个参数传递给构造函数:

Parallel::ForkManager->new($max_process, $tmp_dir_qfn)

相关问题