【发布时间】:2011-04-25 04:04:24
【问题描述】:
我一直遇到multicore 包和大对象的问题。基本思想是我使用 Bioconductor 函数 (readBamGappedAlignments) 来读取大型对象。我有一个文件名的字符向量,我一直在使用mclapply 循环文件并将它们读入列表。该函数看起来像这样:
objects <- mclapply(files, function(x) {
on.exit(message(sprintf("Completed: %s", x)))
message(sprintf("Started: '%s'", x))
readBamGappedAlignments(x)
}, mc.cores=10)
但是,我不断收到以下错误:Error: serialization is too large to store in a raw vector。但是,似乎我可以单独读取相同的文件而不会出现此错误。我发现提到了这个问题here,没有解决方案。
我们将不胜感激任何并行解决方案建议 - 这必须并行完成。我可以看看雪,但我有一个非常强大的服务器,它有 15 个处理器、每个 8 个内核和 256GB 内存,我可以在上面执行此操作。我宁愿只在这台机器上跨内核执行此操作,而不是使用我们的集群之一。
【问题讨论】:
-
您可以在一台机器上使用带雪的套接字集群('localhost' 是默认值)。
-
出现这个错误是因为当parent试图从child取数据时,数据被转换成raw类型的vector,并且vector比R的最长向量2^31 - 1还要长,试试在函数内部移动更多工作,因此结果是“减少”大数据。
-
非常感谢马丁!我怀疑它可能与此有关,但认为它会出现在另一个错误消息中。没有使用
R_len_t再次抬起它丑陋的头......如果我们可以将其设置为 long 并完成它,那就太好了。 -
您可能会改用
foreach,尽管我并不完全清楚长向量出现在哪里。如果不出意外,您还可以通过将每个 2^30 项拆分为一个新列,以将长向量映射到矩阵的方式对对象进行分区。 -
您能否追溯错误,以便我们知道它发生的确切位置?