【问题标题】:mclapply with big objects - "serialization is too large to store in a raw vector"mclapply 与大对象 - “序列化太大而无法存储在原始向量中”
【发布时间】: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 项拆分为一个新列,以将长向量映射到矩阵的方式对对象进行分区。
  • 您能否追溯错误,以便我们知道它发生的确切位置?

标签: r multicore


【解决方案1】:

据传,整数限制很快会在 R 中得到解决。根据我的经验,该限制可能会阻止具有低于 20 亿个单元格(大约是最大整数)的数据集,以及 multicore 包中的 sendMaster 等低级函数依靠传递原始向量。我有大约 100 万个进程,代表大约 4 亿行数据和 8 亿个 data.table 格式的单元格,当 mclapply 将结果发回时,它遇到了这个限制。

分而治之的策略并不难,而且很有效。我意识到这是一种 hack,应该能够依赖 mclapply。

创建一个列表列表,而不是一个大列表。每个子列表都小于损坏的版本,然后您将它们逐个拆分输入 mclapply。打电话给file_map。结果是一个列表列表,因此您可以使用特殊的双重连接do.call 函数。因此,每次 mclapply 完成序列化原始向量的大小都是可管理的。

只需遍历较小的部分:

collector = vector("list", length(file_map)) # more complex than normal for speed 

for(index in 1:length(file_map)) {
reduced_set <- mclapply(file_map[[index]], function(x) {
      on.exit(message(sprintf("Completed: %s", x)))
      message(sprintf("Started: '%s'", x))
      readBamGappedAlignments(x)
    }, mc.cores=10)
collector[[index]]= reduced_set

}

output = do.call("c",do.call('c', collector)) # double concatenate of the list of lists

或者,将输出保存到数据库,例如 SQLite。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 2011-11-01
    • 2021-06-16
    • 1970-01-01
    • 2012-06-13
    • 2017-09-18
    • 2015-12-02
    • 2012-04-27
    相关资源
    最近更新 更多