当我使用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;
}
2条答案
按热度按时间yx2lnoni1#
用array ref Package 它对我很有效。
agxfikkp2#
听起来像是
/tmp
驱动器已满,或者存在某些权限问题,或者某个进程正在背后清理它。请尝试使用其他目录存放临时文件。
为此,请设置环境变量
TMPDIR
,或将目录名作为第二个参数传递给构造函数: