我一直遇到一个问题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 https://stat.ethz.ch/pipermail/r-sig-hpc/2010-August/000708.html,无分辨率。
任何并行解决方案建议将不胜感激 - 这必须并行完成。我可以期待下雪,但我有一个非常强大的服务器,有 15 个处理器,每个处理器 8 个内核,还有 256GB 内存,我可以在上面执行此操作。我宁愿在这台机器上跨核心执行此操作,而不是使用我们的集群之一。
据传,R 中的整数限制很快就会得到解决。根据我的经验,该限制可以阻止单元格数低于 20 亿(大约最大整数)的数据集,以及诸如此类的低级函数sendMaster
in the multicore
包依赖于传递原始向量。我有大约 100 万个进程,代表大约 4 亿行数据和 data.table 格式的 8 亿个单元格,当 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)