云生信学生物信息学

测量对象内容、存储格式和磁盘读写性能

作者:发布于 2026-11-15约 6 分钟阅读
大对象读写慢,先测压缩与路径

大对象读写慢,先测压缩与路径:盘点对象内容;比较两种压缩设置;新进程验证读取;按路径和缓存解释差异
本文操作与检查路径示意。

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")

在新R进程中验证内容

单独运行读取脚本,避免原会话对象占用掩盖实际载入成本。先检查是否成功读入,再比对分析必需的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、缓存和I/O

保存时CPU忙、磁盘不忙,可能说明压缩开销值得比较;网络盘读取慢,先在允许的工作盘使用同一文件做对照。第一次与第二次读取可能受系统缓存影响,应记录次数、顺序、挂载点和其他传输任务。不要清共享系统缓存来制造“冷读”测试,也不要把内存盘结果当普通磁盘性能。

最后保留选定对象、内容清单、软件版本和测量日志。若压缩与路径均已核对而工作流仍受持续读写限制,再凭对象规模、访问频率和用户并发评估工作盘需求;备份与恢复范围需单独明确。

如何判断测试结果

如果gzip文件明显更小但写入更久,是否采用取决于空间压力和保存频率;每次保存都让交互分析等待时,可比较另一种受支持的压缩设置,并检查新进程读取时间。一次会话内重复运行可能命中缓存或受其他任务影响,至少记录多次结果,不要只挑最快的一次。

内容验收除了对象维度,还要检查分析依赖的样本标签、关键assay/layer和降维名称。如果这些内容在导出前就缺失,成功读取也不代表归档合格。对外部矩阵再读取一个小切片,能发现路径断开;须在迁移目的地测试,不能还从原目录读。

压缩比较时固定对象、R版本与挂载点;改变网络路径就另记一组条件。存储规划应提供对象大小范围、每周保存和读取次数、并发会话、实测读写时间,以及磁盘后端目录是否必须同时保留。

参考资料

下载练习材料

下载教程 PDF · 下载代码与示例数据 ZIP

先核对包内SHA256清单,再在独立目录复现。

需要额外算力时

适用前提:对象精简后仍有持续I/O或存储容量需求。如需额外资源,可评估服务器租赁及按需工作盘或存储。咨询时说明软件版本、任务规模和使用期限,配置与支持范围另行确认。

咨询本任务的服务器配置

咨询本任务的服务器配置

留下手机号,我们会结合本文任务与您沟通服务器配置和报价。

也可联系云生信企业微信客服,说明本文任务。

把知识用于当前任务

把方法直接跑起来

使用单细胞在线分析入口,减少环境配置和重复操作。

打开单细胞工具仍有疑问,联系客服 ↗