mclapply与大对象 - “序列化太大,无法存储在原始向量中”

时间:2011-04-25 04:04:25

标签: r multicore

我不断遇到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的内存,我可以做到这一点。我宁愿在这台机器上跨核心进行,而不是使用我们的一个集群。

1 个答案:

答案 0 :(得分:3)

据传,整数限制很快将在R中得到解决。根据我的经验,限制可以阻止数据集的数据集少于20亿个单元格(大约在最大整数范围内),而sendMaster等低级函数则在{{{} 1}} package依赖于传递原始向量。我有大约100万个进程代表大约4亿行数据和8亿个data.table格式的单元格,当mclapply发送结果时,它遇到了这个限制。

分而治之的战略并不难,而且有效。我意识到这是一个黑客,一个人应该能够依赖mclapply。

创建列表列表而不是一个大列表。每个子列表都小于损坏的版本,然后您将它们转换为拆分拆分的mclapply。请拨打此multicore。结果是列表列表,因此您可以使用特殊的双连接file_map函数。因此,每次mclapply完成序列化原始向量的大小都是可管理的大小。

绕过较小的部分:

do.call

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