【问题标题】:Optimization help (R cannot allocate vector)优化帮助(R不能分配向量)
【发布时间】:2018-04-09 12:39:52
【问题描述】:

我有一个 16 GB 的内存,在 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 帮助下运行它吗?我假设几列中的日期时间格式可能会占用大量资源。还没有尝试过,因为我需要日期时间格式的列。

【问题讨论】:

  • 不要在循环中手动调用gc。除了绕过优化并可能严重减慢执行速度之外,您将一无所获。您的问题是您正在循环中增长一个对象。不要那样做。它不仅速度慢,而且会破坏你的记忆。

标签: r optimization memory-management


【解决方案1】:

你可以用 lapply 代替循环试试

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

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

另一种方法是在命令行中而不是在 R 中附加它们。这应该会减少内存占用。只需 google 附加 csv 和您的操作系统适当的命令行工具。

【讨论】:

  • 问题是如果我尝试读取所有文件并将它们保存到变量中,它会给出相同的错误:“无法分配大小的向量......”我试图通过删除数据帧来解决这个问题被合并了。
  • 我已更改您的代码以确保将正确的正则表达式传递给pattern
  • @ZainGill 试试this equivalent data.table solution 是否没有耗尽内存。如果是这样,您根本没有足够的内存来导入数据。
  • 你知道这个正则表达式是做什么的吗?试试grepl("*.csv", "acsverified.dat")
  • rbindlist from data.table 是最好的选择。有关更多信息,请参阅此帖子winvector.github.io/Accumulation
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多