并行处理相关⭐

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 个数字了!
相关推荐
梦想的初衷~19 小时前
MaxEnt物种分布建模完整教程|理论基础、数据获取、R清洗优化与论文制图全流程
r语言·生态遥感·物种分布模拟·maxent建模·r语言数据分析·arcgis实操·科研建模
Omics Pro5 天前
~30,000+引用!理论2005,R包2008,多组学集成AI增强
开发语言·数据库·人工智能·算法·机器学习·自然语言处理·r语言
天桥下的卖艺者7 天前
chrals.CTI函数升级版发布,增加了CTI衍生的脂肪指数提取
数据库·r语言
小师兄吃牛肉8 天前
什么是R语言?如何快速学习R语言
开发语言·学习·r语言
喆星时瑜9 天前
Win10/11 安装 R 与 RStudio 详细图文教程
开发语言·r语言·安装
喆星时瑜9 天前
R语言基础语法入门
开发语言·r语言
喆星时瑜9 天前
R语言向量语法的详细教程
开发语言·r语言
临床数据科学和人工智能兴趣组11 天前
在R语言中, 使用 as.factor() 函数转换数值型变量
开发语言·r语言
babe小鑫21 天前
信息与计算科学专业应届生面试 怎么证明自己能解决业务问题
学习·r语言·excel
深兰科技22 天前
深兰科技受邀参与第二届中国(南宁)—东盟人工智能场景应用对接会,深化AI国际合作
人工智能·qt·r语言·scala·symfony·智能机器人·深兰科技