Cholmod 错误“内存不足”:合并 Seurat 对象

问题描述

我正在尝试合并包含转录组计数数据(稀疏矩阵)的 Seurat 类对象。我对 R 比较陌生,因此感谢任何帮助/解决方案。我添加了我正在处理的数据的屏幕截图。

**General Info:**
-------------

> memory.size(max = TRUE)
[1] 2533.94
R version 4.0.3 (2020-10-10)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 10 x64 (build 19041)

attached base packages:
[1] stats     graphics  Grdevices utils    
[5] datasets  methods   base     

other attached packages:
[1] Rsqlite_2.2.3 Seurat_3.2.3

我不确定我的存储是否是问题,或者我是否应该将功能一分为二。

 options(stringsAsFactors = F)
setwd("C:/Users/Amara/OneDrive - Virginia Tech/XieLab/ZebraFish_Project/zf_brain-master/data")
folders <- list.files("C:/Users/Amara/OneDrive - Virginia Tech/XieLab/ZebraFish_Project/zf_brain-master/data")
library(Seurat)
library(dplyr)
zfbrainList = lapply(folders,function(folder){ 
  CreateSeuratObject(counts = Read10X(folder),project = folder )
})
zfbrain.combined <- merge(zfbrainList[[1]],y = c(zfbrainList[[2]],zfbrainList[[3]],zfbrainList[[4]],zfbrainList[[5]],zfbrainList[[6]],zfbrainList[[7]],zfbrainList[[8]],zfbrainList[[9]],zfbrainList[[10]],zfbrainList[[11]],zfbrainList[[12]],zfbrainList[[13]],zfbrainList[[14]],zfbrainList[[15]]),add.cell.ids = folders,project = "zebrafish")

.cbind2Csp(x,y) 中的错误文件 ../Core/cholmod_memory.c 中的 Cholmod 错误“内存不足”,第 147 行

Data folder

zfbrainlist

解决方法

用于处理原始问题中数据的机器有一个 64 位 Windows 操作系统,运行 32 位版本的 R。memory.size() 的结果显示大约 2.4Gb 的 RAM 可用于R 使用的 malloc() 函数。根据 help for memory.size(),在 64 位 Windows 上运行时,Windows 上的 32 位 R 版本最多可以访问略小于 4Gb 的 RAM。

enter image description here

Memory Limits in R 告诉我们,在 Windows 上的 32 位 R 中,通常不可能分配大小为 2Gb 的单个向量,因为 Windows 在 2 Gb 地址空间的中间消耗了一些内存.

enter image description here

一旦我们从问题中加载数据,zfbrainList 对象将消耗大约 1.2Gb 的 RAM。

options(stringsAsFactors = F)
folders <- list.files("./data/zebraFishData",full.names = TRUE)
library(Seurat)
library(dplyr)
zfbrainList = lapply(folders,function(folder){ 
     CreateSeuratObject(counts = Read10X(folder),project = folder )
})
format(object.size(zfbrainList),units = "Gb")

...结果:

> format(object.size(zfbrainList),units = "Gb")
[1] "1.2 Gb"

此时,代码尝试将列表中的对象合并为一个对象。

zfbrain.combined <- merge(zfbrainList[[1]],y = c(zfbrainList[[2]],zfbrainList[[3]],zfbrainList[[4]],zfbrainList[[5]],zfbrainList[[6]],zfbrainList[[7]],zfbrainList[[8]],zfbrainList[[9]],zfbrainList[[10]],zfbrainList[[11]],zfbrainList[[12]],zfbrainList[[13]],zfbrainList[[14]],zfbrainList[[15]]),add.cell.ids = folders,project = "zebrafish")

当我们计算生成的 zfbrain.combined 对象的大小时,我们发现它的大小也约为 1.2Gb,超过了原始发布者机器上 R 可用的 RAM。

format(object.size(zfbrain.combined),units = "Gb")

> format(object.size(zfbrain.combined),units = "Gb")
[1] "1.2 Gb"

由于在创建 zfbrainListzfbrain.combined 必须在 RAM 中,因此无法在只有 2.4Gb RAM 可访问的 R 实例中执行上述代码的合并,因为zfbrainListzfbrain.combined 消耗的 RAM 介于 2.4 - 2.5Gb 之间,不包括 R 运行所需的其他 RAM。

解决方案:使用 64 位版本的 R

由于大多数基于 Windows 的机器至少有 4Gb 的 RAM,而 memory.size() 报告的 RAM 量为 2.4Gb,因此机器上很可能至少有 4Gb 的 RAM。原帖中使用的机器已经安装了 64 位 Windows,因此我们可以通过安装和运行 64 位版本的 R 来使 R 访问更多内存。

在具有 8Gb RAM 的基于 Windows 的机器上,32 位 R 报告 memory.size()memory.limit() 的以下内容。

enter image description here

有趣的是,R 报告 memory.size() 为 25.25,因为根据 help documentation 1Mb 向下舍入为 0.01,但 memory.limit() 提供 0 到 4095 之间的数字(也根据文档)。在我们的测试机器上,它报告了 3583,大约 3.5Gb 的 RAM。

当我们在同一台机器上的 64 位 R 中运行这些函数时,memory.size() 报告为 34.25,这意味着 malloc() 将分配一个大小为 3.3Gb 的对象,而 {{1} } 报告说 R 可以访问总共 8Gb 的 RAM,这是安装在这台特定机器上的总量。

enter image description here

测试解决方案

当我在 64 位 Windows 上的 32 位 R 4.0.3 会话中运行代码时,我能够复制内存不足错误。

enter image description here

当我在 64 位版本的 R 中运行代码时,它会运行完成,并且我能够计算生成的 memory.limit() 对象的大小。

enter image description here