并行处理相关⭐

1. future包

R最流行的并行框架,seurat 和 signac官方强绑定

只需要用plan() 函数定一个策略,自动完成分配任务

1.1 plan() 核心模式

R 复制代码
plan("sequential")

--- 默认模式,即单线程

R 复制代码
plan("multisession", workers = 16)

--- 在后台真正打开多个全新的R会话,就像是手动开了16个R终端一样,最安全,不容易崩溃,windows和linux通用。

R 复制代码
# 1. 加载并行计算包 (Seurat 和 Signac 自带的御用并行包)
library(future)

# 2. 突破默认的内存封锁线 (极其重要!)
# 默认情况下,R 只允许给子线程分配 500MB 的数据。
# 你的 combined.peaks 肯定极大,必须强行把上限拉高(这里设置为 100GB),否则绝对会报错!
options(future.globals.maxSize = 100 * 1024^3)

# 3. 召唤多线程 (开启 multisession)
# workers 代表你要调用的 CPU 核心数。
# 建议根据你服务器的闲置情况设置,通常 8 到 16 就能带来巨大的加速。
plan("multisession", workers = 16)

# 4. 运行你的计数代码
# 注意:代码完全不用改!Signac 一旦检测到你设置了 plan,
# 就会自动把几十万个 peaks 切成小块,分发给你刚才召唤的 16 个核心同时去扫描 Fragment 文件!

count.list <- lapply(data_list, function(obj) {
  FeatureMatrix(
    fragments = Fragments(obj),
    features = combined.peaks,
    cells = colnames(obj)
  )
})

# 5. 算完之后,记得把多线程关掉,把这 16 个核心还给服务器,避免占用资源。
plan("sequential")

在我的FeatureMatrix任务中,它会自动将每个样本的几十万个peaks基因组坐标均匀切分为16份,然后16个R进程同时启动,每个进程拿着自己分配到的那份Peaks坐标,去fragment文件中扫描和计数,互不干扰,每个进程都会得到一个局部的稀疏矩阵,future有一个主进程-即运行future的这个R会话,它会等16个进程跑完调用矩阵拼接函数,返回最终的完整的矩阵。

属于全新的16个R窗口,彼此完全独立,很稳定,启动慢(因为要重新加载 R 环境),且占用内存稍大(因为数据要复制发送)。

R 复制代码
plan("multicore")

--- linux/mac专属,使用系统的fork机制,直接克隆当前的R进程,启动快,内存共享做的很好,但极其不稳定,在RStudio中运行容易崩溃。

利用fork机制,将当前的R进程,瞬间克隆出16个分身,启动速度非常快,支持**"写时复制(Copy-on-Write)",也就是说这 16 个分身可以共享主进程的内存**,极其节省 RAM,在 RStudio 这种图形界面下极其容易崩溃。

适用于 极其简单的纯 R 代码且急需省内存,在纯 Linux 终端下

R 复制代码
plan('cluster')

--- 用于多台服务器节点的集群运算-如HPC调度

1.2 底层逻辑

如果指定了plan,则seurat底层会将普通的lapply替换成 future.apply::future_lapply,将大任务分块,发给后台的16个子进程,先算完的就领下一块。

2. parallel包,R自带

R内置包,不需安装

2.1 mclapply()

即multi-core lapply

使用时,将lapply改成mclapply(...,mc.cores = 16) 就行,但只能在linux中跑,容易引起内存泄漏,如果你把一个几 GB 的大矩阵传进 mclapply,稍有不慎内存就会暴涨十几倍然后宕机。

3. BiocParallel

Bioconductor生态的包,如DESeq2做转录组差异分析,或基因组比对之类的,底层全是它

3.1 bplapply()

在跑DESeq(dds, parallel = TRUE) 时,后台调用的就是它。

R 复制代码
library(BiocParallel)

# 1. 注册并行环境(相当于 future 的 plan)
# Linux 下推荐用 MulticoreParam (类似 multicore)
# Windows 下必须用 SnowParam (类似 multisession)
bpparam <- MulticoreParam(workers = 16)

# 2. 把参数注册为全局默认
register(bpparam)

# 3. 直接使用 bplapply 替代 lapply 进行循环
# 假设我们有一个简单的耗时任务:算 1 到 100 的平方根
my_list <- 1:100
results <- bplapply(my_list,function(x){
Sys.sleep(1)
return(sqrt(x))}
)

# 这样它就会 16 个核心同时去算这 100 个数字了!
相关推荐
花间相见1 天前
【PaddleOCR教程01】PP-OCRv5 全面指南:从模型架构到实战部署
开发语言·r语言
知识分享小能手1 天前
R语言入门学习教程,从入门到精通,R语言获取数据 (7)
开发语言·学习·r语言
谙弆悕博士2 天前
R 语言学习笔记
笔记·学习·数据分析·r语言·数据可视化
知识分享小能手2 天前
R语言入门学习教程,从入门到精通,R语言日期和时间序列(6)
开发语言·学习·r语言
QH_ShareHub3 天前
从 R 到 Python:数据科学生态的“双语”对照手册
开发语言·python·r语言
Yolo566Q4 天前
环境土壤物理模型HYDRUS1D/2D/3D实践技术应用系统性学习
大数据·开发语言·gpt·学习·arcgis·r语言
知识分享小能手4 天前
R语言入门学习教程,从入门到精通,R语言流程控制语句(5)
开发语言·学习·r语言
知识分享小能手5 天前
R语言入门学习教程,从入门到精通,R语言数据结构(4)
数据结构·学习·r语言
胖哥真不错6 天前
R实现负二项回归模型项目实战
回归·r语言·毕业设计·项目实战·负二项回归模型
知识分享小能手6 天前
R语言入门学习教程,从入门到精通,R语言入门(3)
开发语言·学习·r语言