SCTransform拟合后会在SCT assay中保存校正counts、data和Pearson residuals。residuals通常放在非稀疏的scale.data里,特征数和细胞数都会影响内存。估算时先问:下游到底需要哪些residuals?不要只凭“用了SCT”就推断一定要全基因残差或必须换大内存。
一个双精度稠密矩阵的数值载荷约为“特征数 × 细胞数 × 8字节”。例如2万个基因、10万个细胞,单个全基因矩阵约14.9 GiB;这还不包含counts、SCT模型、中间副本、R和并行worker。此估算只用于识别数量级,不能当成完整峰值。
genes <- 20000
cells <- 100000
residual_gib <- genes * cells * 8 / 1024^3
print(residual_gib)
# 理论载荷估算,不创建矩阵
| 选项/内容 | 作用 | 使用前要确认 |
|---|---|---|
| return.only.var.genes | 仅在scale.data保留可变基因residuals | 下游是否需要全基因residuals |
| conserve.memory | 避免构建完整residual矩阵,降低内存 | 会更慢,并强制仅返回可变基因 |
| ncells | 控制拟合阶段抽样细胞数 | 它不等于最终保留的细胞数 |
| vst.flavor | 选择sctransform模型版本 | 记录版本和方法,不能为省资源随意切换 |
先保存原对象,再检查counts维度、layer和当前assay。用接近正式数据的一份子集跑完SCTransform及计划内的PCA/邻接步骤;记录输出特征数、scale.data维度、对象大小和系统/作业峰值。object.size只能近似描述R对象,不代表函数执行时的临时峰值。
library(Seurat)
stopifnot(inherits(obj, "Seurat"), "RNA" %in% Assays(obj))
dim(obj[["RNA"]])
Layers(obj[["RNA"]])
format(object.size(obj), units = "GiB")
gc()
sessionInfo()
如果下游只需可变特征用于PCA,默认仅保留这些residuals可能已符合流程;若模型或下游检验明确需要全基因residuals,先查方法要求再比较资源。不要为降低峰值而改变基因筛选、回归变量或拟合版本,却仍把结果称作相同分析。每种参数配置要单独保存日志、对象和方法说明,并核对输出特征集合。
记录SCTransform开始和结束时间、退出码、失败步骤、worker数、作业额度及峰值来源。确认SCT assay存在、必要的counts/data/scale.data维度合理,PCA等后续步骤能使用预期数据。若失败发生在建立residuals阶段,比较全基因和仅可变基因的目标差别;若只在并行时失败,先做单worker对照。只有目标分析保持不变且代表性数据仍超出可用额度时,才据实测峰值规划更高内存。
建议每个检查点同时记录细胞数、基因数、SCT scale.data的行列数、是否保留RNA assay、运行worker数和调度器峰值。若峰值接近估算的稠密矩阵载荷,可能还有模型及副本未计入;若高峰出现在保存或合并对象时,应单独测该阶段。清理对象前确认它是否是原始counts或分析复核所需检查点。rm和gc能帮助回收不再引用的对象,但不能把算法本身必须生成的矩阵变小,也不能保证操作系统立即回收所有常驻内存。
每次试跑用唯一目录保存输入摘要、参数、版本、开始结束时间和日志;同时记录申请内存、实际峰值、峰值来源及任务退出码。若平台只提供主进程RSS,就在记录中注明这一点,不把它写成作业组峰值。同一输入重复测量时保留每次结果和节点负载,能帮助判断测量波动是否来自共享环境。