使用R中的大量csv文件

时间:2015-03-23 23:23:52

标签: r csv parallel-processing

我有一个包含~40000个csv文件的目录,每个文件的大小范围从~400字节到~11 MB。我编写了一个读取csv文件的函数,并为每个csv文件计算一些基本数字(例如,每个csv文件中有多少"女性和#34;的值)。此代码成功运行了相同数量的csv文件,但是当csv文件较小时。

我使用软件包paralleldoParallel在我的计算机上运行它并收到以下错误:

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会话崩溃了。

0 个答案:

没有答案