优化帮助(R不能分配矢量)

时间:2018-04-09 12:39:53

标签: r optimization memory-management

我有一个16 GB的ram在64位版本的R上运行w10 64位。 我试图在这个链接(http://www.nyc.gov/html/tlc/html/about/trip_record_data.shtml)上合并一堆CSV,特别是黄色位 编辑:仅适用于一年的atm,但是一旦有效,就会导入更多数据

继承人正在运行的代码

library(readr)
FList <- list.files(pattern = "*.csv")
for (i in 1:length(FList))
  {
  print(i)
  assign(FList[i], read_csv(FList[i]))
  if (i==2) {
    DF<-rbind(get(FList[1]),get(FList[2]))
    rm(list = c(FList[1],FList[2]))
  }
  if (i>2)
    {
    DF<-rbind(DF,get(FList[i]))
    rm(list = FList[i])
  }
  gc()
}

我在第6次迭代时得到错误,任务管理器在rbind操作期间显示90%的内存使用率,但在完成后降至60

错误后运行gc()给出以下内容

> gc()
             used    (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells    3821676   204.1   10314672   550.9   13394998   715.4
Vcells 1363034028 10399.2 3007585511 22946.1 2058636792 15706.2
> 

我对此没有太多经验,任何优化代码的帮助都会受到赞赏。 p.s会用read.csv帮助运行吗?我假设几列中的日期时间格式可能是资源匮乏的。还没试过,因为我需要日期时间格式的列。

2 个答案:

答案 0 :(得分:2)

您可以使用lapply而不是循环

来尝试
files <- list.files(pattern = glob2rx("*.csv"))

df <- lapply(files, function(x) read.csv(x))
df <- do.call(rbind, df)

另一种方法是将它们添加到命令行而不是R中。这应该是内存密集度较低的。只需谷歌附加csv和您的操作系统相应的命令行工具。

答案 1 :(得分:0)

从行bind_rows开始,按行数据帧绑定的更有效,更快捷的方法是dplyr

Here更多细节。

您的代码改编为bind_rows

library(readr)
library(dplyr)
FList <- list.files(pattern = "*.csv")
for (i in 1:length(FList))
{
  print(i)
  assign(FList[i], read_csv(FList[i]))
  if (i==2) {
    DF<-bind_rows(get(FList[1]),get(FList[2]))
    rm(list = c(FList[1],FList[2]))
  }
  if (i>2)
  {
    DF<-bind_rows(DF,get(FList[i]))
    rm(list = FList[i])
  }
  gc()
}

如果问题仍然存在,如果可能,请尝试以this方式增加RAM大小。