【发布时间】: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