R语言-Chunk大型数据框与稀疏矩阵应对 as.matrix溢出异常 “problem too large”

简介: 本文提出一种在R里面将大型数据集通过分块的方式转换出 DataFrame和 SparseMatrix的方法,能有效避免内存溢出、程序崩溃等严重问题。

单细胞组学数据分析接触到的项目大都使用压缩文件(rds,txt,tsv,csv,mtx)进行数据存储。有时候,我们会操作相当大的压缩数据对象,而超大型的数据集如(一个包含约 100 万个细胞和约 3 万个基因的表达矩阵)在进行数据类型转换等处理的时候会遇到异常 Error in asMethod(object) : Cholmod error 'problem too large' ,指的是其中 as.matrix()转换 Dense矩阵,导致内存溢出。这个问题意味着处理数据的维度超过 as.matrix() 支持的最大元素容量 $(2147483647 (2^{31}-1))$。

本文提出一种在R里面将超大数据集切块后用as.matrix() 转换,再转换超大数据框和稀疏矩阵方法(as.spM_DFas.DF_spM)。在R中 Chunk数据是一种有效处理大型数据集的方法,该方法虽然一定程度上牺牲了一些效率,但能有效避免内存溢出、程序崩溃等严重问题。

0、测试数据生成

getData <- function(n=100,is.str=FALSE,data.class="data.frame"){
    data.retro = data.frame(
        value = ceiling(runif(n = n,min = -1,max = 1)),
        norm = rnorm(n=n,mean=10,sd=1),
        expr = rexp(n),
        No = seq(n)
    )
    if (is.str) {data.retro = cbind(data.retro,strings = stringi::stri_rand_strings(n, 5, pattern = "[A-Za-z0-9]"))}
    switch (data.class,
            data.frame = {data.frame},
            matrix = {as.matrix(data.frame)}
    )
    return(data.retro)
}

1、 超大型稀疏矩阵转换出数据框

as.spM_DF <- function(data.use,chun_size=20000000) {
    lapply(  split(seq(nrow(data.use)), (seq(nrow(data.use))-1) %/% as.numeric(chun_size) )  , function(nx) {
        if ( is.null(nrow(data.use[nx,])) ) {
            as.data.frame(t(as.matrix(data.use[nx,])))
        }else{
            as.data.frame(as.matrix(data.use[nx,]))
        }
    }) %>% dplyr::bind_rows()
}

方法调用: as.spM_DF(as(as.matrix(getData(100)),"dgCMatrix"))

2、 超大型数据框转换出稀疏矩阵

as.DF_spM <- function(data.use,chun_size="20000000",sparseClass="dgCMatrix") {
    lapply(  split(seq(nrow(data.use)), (seq(nrow(data.use))-1) %/% as.numeric(chun_size) )  , function(nx) {
        switch(sparseClass,
               dgTMatrix = {as(as.matrix(data.use[nx,]),"dgTMatrix")},
               dgCMatrix = {as(as.matrix(data.use[nx,]),"dgCMatrix")},
               dgRMatrix = {as(as.matrix(data.use[nx,]),"dgRMatrix")},
               stop("Enter one of the three types of sparse matrix(\"dgTMatrix\",\"dgCMatrix\",\"dgRMatrix\")")
               )
        }) %>% Matrix.utils::rBind.fill()
}

方法调用 : as.DF_spM(getData(100),sparseClass = "dgTMatrix")

3、 分块写出超大型数据框

write_big_DF <- function(data.use,chun_size="20000000",file = "text.tsv",sep="\t",col.names=F,row.names=T,quote=F){
    ### first write colnames
    if (col.names) {write.table(x = data.use[0,],file = file,sep = sep,quote = quote,append = F,row.names = row.names,col.names = T)}
    lapply(  split(seq(nrow(data.use)), (seq(nrow(data.use))-1) %/% as.numeric(chun_size) )  , function(nx) {
        ### append content
        write.table(x = data.use[nx,],file = file,sep = sep,quote = quote,append = T,row.names = row.names,col.names = F)
    }) -> . ;rm(.)
}

方法调用 :write_big_DF(getData(10,is.str = T),chun_size = 3,file = "text.tsv",col.names=T,row.names = F)

目录
相关文章
|
6月前
|
算法 数据挖掘
R语言——AVOCADO“(异常植被变化检测)算法(1990-2015数据分析)监测森林干扰和再生(含GEE影像下载代码)
R语言——AVOCADO“(异常植被变化检测)算法(1990-2015数据分析)监测森林干扰和再生(含GEE影像下载代码)
102 1
|
6月前
|
机器学习/深度学习 运维 算法
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值
|
6月前
|
数据可视化
R语言马尔可夫链(MARKOV CHAIN, MC)模拟赌徒破产模型GAMBLER’S RUIN PROBLEM可视化
R语言马尔可夫链(MARKOV CHAIN, MC)模拟赌徒破产模型GAMBLER’S RUIN PROBLEM可视化
R语言笔记丨因子、数据框基础知识
R语言笔记丨因子、数据框基础知识
R语言之数据框的合并
R语言之数据框的合并
242 1
R语言之数据框的合并
|
人工智能 数据挖掘 Linux
ChatGPT × R语言 丨实际数据分析过程中,AI能够带来哪些改变?数据框操作案例分享
ChatGPT × R语言 丨实际数据分析过程中,AI能够带来哪些改变?数据框操作案例分享
|
存储 数据处理 对象存储
R语言-稀疏矩阵对象格式介绍&重构方法
在单细胞领域,基于稀疏矩阵对于处理 scRNA-seq 表达谱数据这类大型数据是非常必要的,因为构建分析对象的时候稀疏矩阵相比稠密矩阵拥有更高的数据处理效率和速度。本文重点介绍 在R语言平台关于 Matrix包中Sparse Matrix对象的格式, 与Dense Matrix的转换以及重构方法。
502 0
R语言-稀疏矩阵对象格式介绍&重构方法
R语言-创建空数据框(Empty Data Frame )用于追加数据
本文分享了如何在R语言通过创建空数据框来实现追加数据的简单实现方法,以供参考
761 0
|
移动开发 Linux
Linux 下基于R语言打开hdf5(.h5)文件异常的处理方法
本文分享了如何在 Linux 中关闭 hdf5 文件锁定,让rhdf5 能够调用 HDF5库解析 h5文件的处理方法,以供参考
768 0
|
SQL 数据库
R语言Data Frame数据框常用操作
Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的。 Data Frame每一列有列名,每一行也可以指定行名。
3427 0