我有一个包含~40000个csv文件的目录,每个文件的大小范围从~400字节到~11 MB。我编写了一个读取csv文件的函数,并为每个csv文件计算一些基本数字(例如,每个csv文件中有多少"女性和#34;的值)。此代码成功运行了相同数量的csv文件,但是当csv文件较小时。
我使用软件包parallel
和doParallel
在我的计算机上运行它并收到以下错误:
Error in unserialize(node$con) : error reading from connection
我怀疑我的内存耗尽,但我不确定如何最好地处理我正在使用的文件的大小增加。我的代码如下:
说出' fpath'是所有这些csv所在目录的路径:
fpath<-"../Desktop/bigdirectory"
filelist <- as.vector(list.files(fpath,pattern="site.csv"))
(f <- file.path(fpath,filelist))
# demographics csv in specified directory
dlist <- as.vector(list.files(fpath,pattern="demographics.csv"))
(d <- file.path(fpath,dlist))
demos <- fread(d,header=T,sep=",")
cl <- makeCluster(4)
registerDoParallel(cl)
setDefaultCluster(cl)
clusterExport(NULL,c('transit.grab'))
clusterEvalQ(NULL,library(data.table))
sdemos <- demo.grab(dl[[1]],demos)
stmp <- parLapply(cl,f,FUN=transit.grab,sdemos)
功能&#39; transit.grab&#39;如下:
transit.grab <- function(sitefile,selected.demos){
require(sqldf)
demos <- selected.demos
# Renaming sitefile columns
sf <- fread(sitefile,header=T,sep=",")
names(sf)[1] <- c("id")
# Selecting transits from site file using list of selected users
sdat <- sqldf('select sf.* from sf inner join demos on sf.id=demos.id')
return(sdat)
}
我没有找人来调试代码,因为我知道它可以正常运行以获得少量数据,但我迫切需要有关如何为~6.7 GB数据实现此代码的建议。欢迎提出任何反馈,谢谢!
更新:
正如所建议的那样,我将sqldf()
替换为merge()
,这在较小的目录上进行测试时将计算时间缩短了一半。通过Activity Monitor观察我的内存使用情况时,我的趋势非常平淡。但是现在当我尝试在大目录上运行我的代码时,我的R会话崩溃了。