【问题标题】:Error using perl module Parallel::ForkManager使用 perl 模块 Parallel::ForkManager 时出错
【发布时间】:2018-12-09 08:09:07
【问题描述】:

我在使用 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;
}

【问题讨论】:

  • 好的,出现错误时/tmp/1341650.1.longjob.q/dZnCgF1MiR是否存在? (每次运行程序时,此目录都会有不同的名称。)
  • 您是否尝试过单独处理错误文件,即在并行处理尝试之外?对于 Storable 来说,它有缺陷的文件出现问题当然是合理的。
  • @James:Storable 由Parallel::ForkManager 在内部使用。它用于将信息从子线程传递回父线程。
  • 在 Biostars 交叉发布:biostars.org/p/323998

标签: multithreading perl


【解决方案1】:

听起来/tmp 驱动器已满,或者存在一些权限问题,或者某个进程正在背后清理它。

尝试为临时文件使用另一个目录。

为此,请设置环境变量TMPDIR,或将目录名称作为第二个参数传递给构造函数:

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

【讨论】:

  • 非常感谢您的回答。
  • 您的解决方案解决了“可存储模块”的问题。但我仍然收到“无法分叉”错误消息。我检查了 ForkManager.pm 模块,当模块启动“my $pid=fork();”行时,它发现 $pid 没有定义。但是,我无法弄清楚为什么 $pid 没有定义。我想知道这个错误是否与我编写程序的方式有关:一个文件的作业将被发送到一个插槽。在我的情况下,我有 ~300 个文件,前 70 个运行顺利,然后我收到此错误...
  • $! 在fork 返回 undef 时设置为错误消息。最有可能的是,您的进程可以同时拥有的子进程数量已达到限制。这可能是可配置的
猜你喜欢
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多