超大文本文件如何快速读取以及写入到硬盘

2023-09-25 14:34:04 浏览数 (3)

如果大家跑过inferCNV这样的肿瘤单细胞拷贝数变异代码,就会发现它这个函数(CreateInfercnvObject),有一个诡异的设置,就是它会自动读取当前工作目录下面的3个文件 :

代码语言:javascript复制
expFile='expFile.txt'
groupFiles='groupFiles.txt'
geneFile='geneFile.txt'

# duplicate 'row.names' are not allowed
library(infercnv)
infercnv_obj = CreateInfercnvObject(raw_counts_matrix=expFile,
                                    annotations_file=groupFiles,
                                    delim="t",
                                    gene_order_file= geneFile,
                                    ref_group_names=c('ref-1',
                                                      'ref-2'))  ## 这个取决于自己的分组信息里面的
 

这样的话, 我们就不得不把在R里面的变量,写出到硬盘,成为文件。感觉是在使用一个独立的网页工具。。。。

如下所示,是我以前的代码;

代码语言:javascript复制
dim(dat)
expFile='expFile.txt'
write.table(dat,file = expFile,sep = 't',quote = F) 
groupFiles='groupFiles.txt'
head(groupinfo)
write.table(groupinfo,file = groupFiles,sep = 't',quote = F,col.names = F,row.names = F)
head(geneInfor)
geneFile='geneFile.txt'
write.table(geneInfor,file = geneFile,sep = 't',quote = F,col.names = F,row.names = F)

其中,dat变量是单细胞表达量矩阵,通常是几万个细胞,几万个基因,这样的话,输出的txt文本文件会超级大,非常的耗时!!!是时候改变它了,所以我求助了chatGPT,如果大家不能使用外网的chatGPT,也可以参考我们通过BioinfoArk提供的中国区chatGPT的查询方式

求助了chatGPT

我采纳了它的第一个建议,然后试着对比一下:

代码语言:javascript复制
# 代码段1
start_time1 <- Sys.time()
# Your code here
write.table(dat,file = expFile,sep = 't',quote = F)
end_time1 <- Sys.time()
execution_time1 <- end_time1 - start_time1

# 代码段2
start_time2 <- Sys.time()
# Your code here
  fwrite(dat, file = expFile,  row.names = T,sep = "t", quote = FALSE)
end_time2 <- Sys.time()
execution_time2 <- end_time2 - start_time2

# 比较耗时
if (execution_time1 < execution_time2) {
  cat("代码段1执行时间更短:", execution_time1, "n")
} else if (execution_time1 > execution_time2) {
  cat("代码段2执行时间更短:", execution_time2, "n")
} else {
  cat("两个代码段执行时间相同:", execution_time1, "n")
}


这个时间层面的提高,数值提高简直是恐怖如斯!!!!

代码语言:javascript复制
代码段2执行时间更短: 0.392374 
> execution_time1
Time difference of 1.92164 mins

1 人点赞