在Google Colab运行R代码时遇GenPro未找到及内存崩溃问题求助
问题1:函数未找到错误
- 原因:R是解释型语言,代码按从上到下顺序执行,你先调用了
GenPro()但函数定义在调用之后,解释器此时无法找到该函数;另外错误提示中的Genpro()(小写p)与你定义的GenPro()(大写P)大小写不匹配,R对大小写敏感。 - 修复:
- 将
GenPro()调用语句移到整个函数定义的末尾 - 确保调用时函数名大小写与定义完全一致
- 将
问题2:内存耗尽导致会话崩溃
- 原因:代码每次循环都会创建4个大矩阵,并行计算时每个子进程还会复制全局环境中的
seq、qua等大对象,加上循环次数接近30万次,内存占用急剧飙升;此外代码存在变量名错误(write.table中使用了未定义的out.file,实际参数名是output.file)。 - 优化修复:
- 合并冗余矩阵:把
a.Q/t.Q/g.Q/c.Q合并为一个4行的单一矩阵,大幅减少内存开销 - 并行任务仅传必要变量:用
.export指定需要传递给子进程的变量,避免全局变量被全部复制 - 提前加载依赖包:在并行任务外加载
stringr,避免每个子进程重复加载 - 修正变量名错误:将
out.file改为output.file - 简化数据结构:
seq和qua无需转为矩阵,用向量即可满足需求 - 动态计算索引:根据实际数据行数生成
idx_1和idx_2,避免硬编码导致的多余计算
- 合并冗余矩阵:把
修改后的完整代码
input.data.dir = "/content/chr177.txt" output.data.dir = "/content/chr177.csv" GenPro <- function(input.data = input.data.dir, output.file = output.data.dir){ data = read.table(input.data, sep="\t") print(data) ASCII_Q = c('!', '"', '#', '$', '%', '&', "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I") # 动态计算索引,适配实际数据行数 total_rows = nrow(data) idx_1 = seq(from=2, to=total_rows, by=4) seq = data[idx_1,1] idx_2 = seq(from=4, to=total_rows, by=4) qua = data[idx_2,1] rm(data) # 及时释放内存 # 提前加载所有依赖包 library(stringr) library(foreach) library(doParallel) ###---------------------------------------- 并行计算 fun <- function(x){ seq_line = str_split(seq[x],"")[[1]][-1] qua_line = str_split(qua[x],"")[[1]][-1] # 用单一矩阵替代四个冗余矩阵 Q.matrix_line = matrix(0, nrow=4, ncol=length(ASCII_Q)) for(i in 1:length(seq_line)){ base = seq_line[i] qua_char = qua_line[i] idx = which(ASCII_Q == qua_char) if(base == "A") Q.matrix_line[1, idx] = 1 else if(base == "T") Q.matrix_line[2, idx] = 1 else if(base == "G") Q.matrix_line[3, idx] = 1 else if(base == "C") Q.matrix_line[4, idx] = 1 } return(Q.matrix_line) } cl <- makeCluster(4) # 适当减少CPU数量,降低内存竞争 registerDoParallel(cl) # 仅传递必要变量,避免全局环境复制 Q.matrix <- foreach(x=1:length(seq), .combine='+', .export=c("seq", "qua", "ASCII_Q")) %dopar% fun(x) stopCluster(cl) ##------------------------------------------------------------ 概率计算 Q.matrix.p = Q.matrix for(i in 1:nrow(Q.matrix.p)){ row_sum = sum(Q.matrix.p[i,]) if(row_sum > 0) Q.matrix.p[i,] = Q.matrix.p[i,]/row_sum } write.table(Q.matrix.p, file=output.file, row.names=F, col.names=F, quote=F, sep="\t") } # 函数定义完成后再调用 GenPro()
内容的提问来源于stack exchange,提问作者Mohammed Fisal Ahmad Mohammad
相关产品推荐
相关产品推荐

