我不断遇到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的内存,我可以做到这一点。我宁愿在这台机器上跨核心进行,而不是使用我们的一个集群。
答案 0 :(得分:3)
据传,整数限制很快将在R中得到解决。根据我的经验,限制可以阻止数据集的数据集少于20亿个单元格(大约在最大整数范围内),而sendMaster
等低级函数则在{{{} 1}} package依赖于传递原始向量。我有大约100万个进程代表大约4亿行数据和8亿个data.table格式的单元格,当mclapply发送结果时,它遇到了这个限制。
分而治之的战略并不难,而且有效。我意识到这是一个黑客,一个人应该能够依赖mclapply。
创建列表列表而不是一个大列表。每个子列表都小于损坏的版本,然后您将它们转换为拆分拆分的mclapply。请拨打此multicore
。结果是列表列表,因此您可以使用特殊的双连接file_map
函数。因此,每次mclapply完成序列化原始向量的大小都是可管理的大小。
绕过较小的部分:
do.call
或者,将输出保存到数据库,例如SQLite。