You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:15:46