并行处理相关⭐

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 个数字了!
相关推荐
WiKiLeaks_successor2 小时前
R_day3(DataType:matrix)
r语言
喵本喵叁肆2 天前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
电科_银尘7 天前
【深度学习项目实战·17】行人目标检测:用Faster R-CNN找出图片中的行人
深度学习·目标检测·r语言
Biotree_202516 天前
实验谱库检索不再是唯一答案:AIMe依托预测质谱空间,实现小分子MS²全域注释检索
r语言
Canmag 兴隆磁性19 天前
回复磁导率 μ_R:永磁体在动态磁路中的关键参数
开发语言·学习·r语言·永磁材料·充磁·磁导率
临床数据科学和人工智能兴趣组21 天前
提取匹配模式的第一个值
人工智能·r语言·1024程序员节·r语言-4.2.1·临床试验·临床科研·科学问题
临床数据科学和人工智能兴趣组22 天前
在数据分析和处理过程中,字符串的操作常常扮演着极其重要的角色。R语言内置了多种功能强大的字符串处理函数,gsub() 就是其中之一
数据分析·r语言·r语言-4.2.1·临床研究·临床试验·临床科研
dfjdkfahkjd1 个月前
开源项目吐槽大会:技术文章大纲
r语言
爱读书的小胖1 个月前
Codewars:Last digit of a large number(C)解题分析
c语言·开发语言·r语言
生态学者1 个月前
Global Change Biology | 森林越“步调一致”,反而越怕干旱?树木生长与叶片活动的同步之谜
大数据·人工智能·算法·r语言·微信公众平台