Seurat对象保存或重新读入很慢,可能来自序列化压缩、CPU、磁盘或网络路径。文件小并不说明运行时对象小;反过来,RDS可读也不保证对象所引用的外部矩阵目录存在。先把保存时间、文件大小、新进程读取时间和内容完整性分开记录,再比较方案。
记录细胞和特征数、assay/layer、R与Seurat版本及对象是否引用磁盘矩阵。保留一个原始副本;在新测试目录比较设置,不覆盖正式文件。object.size是对象大小的近似值,不能代表进程峰值或外部目录总大小。
| 记录项 | 如何测 | 不能推出 |
|---|---|---|
| 对象大小 | object.size | 进程峰值 |
| 序列化文件 | file.info | 还原后的内存 |
| 写入/读取 | 计时并记录路径 | 换压缩一定更快 |
| 对象结构 | 维度、assay和layer | 外部数据齐全 |
对相同对象写入不同的新文件,记录写入时间和大小。测试文件需要临时空间,空间不足时不要同时创建多份大副本;先规划目录。压缩可能减少磁盘用量、增加CPU工作,结论只对这份对象和当前存储环境有效。
stopifnot(exists("obj"))
dir.create("rds-test", showWarnings=FALSE)
stopifnot(!file.exists("rds-test/plain.rds"),
!file.exists("rds-test/gzip.rds"))
t_plain <- system.time(saveRDS(obj,"rds-test/plain.rds",compress=FALSE))
t_gzip <- system.time(saveRDS(obj,"rds-test/gzip.rds",compress="gzip"))
print(rbind(plain=t_plain,gzip=t_gzip))
print(file.info(c("rds-test/plain.rds","rds-test/gzip.rds"))$size)
writeLines(capture.output(sessionInfo()),"rds-test/session.txt")单独运行读取脚本,避免原会话对象占用掩盖实际载入成本。先检查是否成功读入,再比对分析必需的assay、layer、细胞/特征维度和样本标识;有磁盘后端时,还要读一小块矩阵数据,确认外部路径真实可用。
args <- commandArgs(trailingOnly=TRUE)
stopifnot(length(args)==1L)
t <- system.time(x <- readRDS(args[1]))
print(t); print(class(x)); print(dim(x))
if (inherits(x,"Seurat")) {
print(SeuratObject::Assays(x))
print(lapply(SeuratObject::Assays(x), function(a) SeuratObject::Layers(x[[a]])))
}
print(format(object.size(x),units="GiB"))
writeLines(capture.output(sessionInfo()),"read-session.txt")若文件可读但访问 layer 报路径错误,应把它当作后端迁移问题。SeuratObject提供SaveSeuratRds与LoadSeuratRds处理磁盘layer,其move和relative选项会改变文件组织或路径行为,先查看当前版本文档并在副本验证。RDS用于恢复R对象,不应直接当成通用的跨软件交换格式。
保存时CPU忙、磁盘不忙,可能说明压缩开销值得比较;网络盘读取慢,先在允许的工作盘使用同一文件做对照。第一次与第二次读取可能受系统缓存影响,应记录次数、顺序、挂载点和其他传输任务。不要清共享系统缓存来制造“冷读”测试,也不要把内存盘结果当普通磁盘性能。
最后保留选定对象、内容清单、软件版本和测量日志。若压缩与路径均已核对而工作流仍受持续读写限制,再凭对象规模、访问频率和用户并发评估工作盘需求;备份与恢复范围需单独明确。
如果gzip文件明显更小但写入更久,是否采用取决于空间压力和保存频率;每次保存都让交互分析等待时,可比较另一种受支持的压缩设置,并检查新进程读取时间。一次会话内重复运行可能命中缓存或受其他任务影响,至少记录多次结果,不要只挑最快的一次。
内容验收除了对象维度,还要检查分析依赖的样本标签、关键assay/layer和降维名称。如果这些内容在导出前就缺失,成功读取也不代表归档合格。对外部矩阵再读取一个小切片,能发现路径断开;须在迁移目的地测试,不能还从原目录读。
压缩比较时固定对象、R版本与挂载点;改变网络路径就另记一组条件。存储规划应提供对象大小范围、每周保存和读取次数、并发会话、实测读写时间,以及磁盘后端目录是否必须同时保留。