在R编程环节有所限制未必不是好事

学术   2024-11-10 08:59   广东  

在前面的笔记中:扎克伯格背刺基于R语言的Seurat单细胞生态 我提到了这个CELLxGENE 在线平台,它上面有很多单细胞数据集,而且大部分提供了.h5ad 格式文件,里面有单细胞表达量矩阵。但有一些却没有对应的Seurat体系的文件,比如:https://cellxgene.cziscience.com/collections/4796c91c-9d8f-4692-be43-347b1727f9d8

是 929,686 cells derived from 156 fresh clinical samples obtained from 41 HGSOC patients ,我们可以很容易的根据前面的笔记中:扎克伯格背刺基于R语言的Seurat单细胞生态 进行python单细胞处理:

import scipy.sparse as sparse
import scipy.io as sio
import scipy.stats as stats
import numpy as np
import scanpy as sc
import os
all_data=sc.read_h5ad("./fdff1375-aafc-48ef-b5b1-b1ff8466d92c.h5ad")
cellinfo=all_data.obs
geneinfo=all_data.var
#mtx=all_data.X.T 
raw_data = all_data.raw.X
mtx = raw_data.T
cellinfo.to_csv("cellinfo.csv")
geneinfo.to_csv("geneinfo.csv")
sio.mmwrite("sparse_matrix.mtx",mtx) 

关于上面的代码得到的单细胞表达量矩阵,有一个问题:

ls -lh inputs/
total 55G
-rw-rw-r-- 1 t180559 t180559 537M 11月  9 23:44 cellinfo.csv
-rw-rw-r-- 1 t180559 t180559 2.1M 11月  9 23:44 geneinfo.csv
-rw-rw-r-- 1 t180559 t180559  54G 11月 10 00:52 sparse_matrix.mtx

就是 sparse_matrix.mtx文件会导致报错:

Error in scan(file, nmax = 1, what = what, quiet = TRUE, ...) : 
  scan() expected 'an integer', got '2178171554'
Calls: readMM -> scan1 -> scan
Execution halted

==> inputs/sparse_matrix.mtx <==
%%MatrixMarket matrix coordinate real general
%
31815 929690 2178171554

因为上面的数值 2178171554 确实超出了 R 中 int 类型的范围。在 32 位系统中,R 的 int 类型通常是一个 32 位整数,其范围是 -2^31 到 2^31-1,即 -2,147,483,648 到 2,147,483,647。

对于超出 int 类型范围的数值,R 提供了 integer64 类型,它是一个 64 位整数类型,其范围大约是 -2^63 到 2^63-1。在 64 位系统中,R 的 int 类型实际上是 integer64 类型,因此可以容纳更大的数值。

其实我们没必要解决这个数值范围问题

这个是r编程语言设计之初的考虑,我们作为使用者,有很多曲线救国的方法。其实就像大家在单细胞转录组数据处理过程也很遇到很多很多内存限制,因为不可能大家的计算机资源是无限的,但并不是每个内存限制都是靠加内存接近的。 

内存限制是进行大规模生物信息学分析时的一个主要挑战,尤其是在处理大规模单细胞数据集时。以下是一些应对内存限制的策略和方法:

  1. 抽样分析
  • 对于细胞通讯分析,可以通过随机抽样的方式减少细胞数量,从而减少内存消耗。
  • 亚群分析
    • 对于拟时序等分析,可以只针对具有生物学联系的特定亚群进行分析,而不是对所有细胞进行分析。
  • 分而治之
    • 对于可以独立处理的分析(如单细胞打分),可以将数据集拆分成多个子集,分别处理后再合并结果。
  • 数据子集
    • 只加载数据的一个子集进行分析,而不是一次性加载整个数据集。

    正是因为有所限制才让大家理解数据分析的本质

    上面是从生物学角度去理解单细胞转录组数据分析的本质,如果是从计算机角度看,需要做的应该是:

    1. 内存管理
    • 优化代码以减少内存使用,例如使用更高效的数据结构和算法。
  • 使用外部工具
    • 利用专门的数据库和计算平台来处理大规模数据。
  • 分布式计算
    • 采用分布式计算框架,如Apache Spark,来处理大规模数据集。
  • 云计算服务
    • 利用云计算服务提供商提供的高性能计算资源。
  • 数据压缩
    • 使用数据压缩技术减少数据占用的存储空间。
  • 增量加载
    • 采用增量加载的方式逐步加载数据,而不是一次性加载全部数据。
  • 并行处理
    • 利用多核处理器的并行处理能力来加速计算。
  • 优化数据存储格式
    • 使用更高效的数据存储格式,如稀疏矩阵格式,以减少内存占用。
  • 清理工作环境
    • 在分析过程中定期清理不再需要的变量和对象,释放内存。
  • 使用专业软件
    • 针对特定分析使用专业的软件和工具,这些工具通常经过优化,能够更有效地处理大数据。


    生信技能树
    生物信息学学习资料分析,常见数据格式及公共数据库资料分享。常见分析软件及流程,基因检测及癌症相关动态。
     最新文章