并行处理相关⭐

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 个数字了!
相关推荐
国医中兴2 小时前
Flutter 组件 r_flutter 的适配 鸿蒙Harmony 实战 - 驾驭资源映射自动化、实现鸿蒙端资产强类型引用与资产冲突静态校验方案
flutter·r语言·harmonyos
探序基因3 小时前
安装空间转录组分析软件-R包SPATA2的安装
开发语言·r语言
劳工搬砖记录bot_ssprott2 天前
conda全流程安装seurat4及其依赖 | 包含各类报错解决
r语言·conda
白杆杆红伞伞2 天前
R_常用函数
开发语言·r语言
QH_ShareHub2 天前
Rstudio 与 R 打开 Rdata (压缩文件) 差异
java·前端·r语言
浩浩kids3 天前
R•Homework
开发语言·r语言
AI科技星4 天前
基于wr/c + h/c = 1的螺旋线矢量特性及应用分析
c语言·开发语言·人工智能·opencv·算法·计算机视觉·r语言
探序基因6 天前
R语言读取单细胞转录组基因表达矩阵loom文件
开发语言·r语言
房开民8 天前
paddle 文本检测识别模型转为onnx
开发语言·r语言·paddle