使用 ff package of R ,我将一个 csv 文件导入到 ffdf 对象中,但惊讶地发现该对象占用了大约 700MB 的 RAM。 ff 不应该将数据保存在磁盘而不是 RAM 中吗?我做错什么了吗?我是 R 的新手。感谢任何建议。谢谢。

> training.ffdf <- read.csv.ffdf(file="c:/temp/training.csv", header=T)
> # [Edit: the csv file is conceptually a large data frame consisting
> # of heterogeneous types of data --- some integers and some character
> # strings.]
>
> # The ffdf object occupies 718MB!!!
> object.size(training.ffdf)
753193048 bytes
Warning messages:
1: In structure(.Internal(object.size(x)), class = "object_size") :
  Reached total allocation of 1535Mb: see help(memory.size)
2: In structure(.Internal(object.size(x)), class = "object_size") :
  Reached total allocation of 1535Mb: see help(memory.size)
>
> # Shouldn't biglm be able to process data in small chunks?!
> fit <- biglm(y ~ as.factor(x), data=training.ffdf)
Error: cannot allocate vector of size 18.5 Mb

编辑: 我听从了 Tommy 的建议,省略了 object.size 调用并查看了任务管理器(我在具有 4GB RAM 的 Windows XP 机器上运行 R)。我 ffsave 对象,关闭 R,重新打开它,并从文件加载数据。问题占了上风:
> library(ff); library(biglm)
> # At this point RGui.exe had used up 26176 KB of memory
> ffload(file="c:/temp/trainingffimg")
> # Now 701160 KB
> fit <- biglm(y ~ as.factor(x), data=training.ffdf)
Error: cannot allocate vector of size 18.5 Mb

我也试过
> options("ffmaxbytes" = 402653184) # default = 804782080 B ~ 767.5 MB

但是加载数据后,RGui还是用了700多MB内存,biglm回归还是报错。

最佳答案

您需要将数据分块提供给 biglm,请参阅 ?biglm。
如果传递 ffdf 对象而不是 data.frame,则会遇到以下两个问题之一:

  • ffdf 不是 data.frame,所以会发生一些未定义的事情
  • 您传递给的函数尝试通过例如将 ffdf 转换为 data.frame as.data.frame(ffdf),它很容易耗尽你的 RAM,这可能就是你遇到的情况

  • 检查 ?chunk.ffdf 以获取如何将块从 ffdf 传递到 biglm 的示例。

    关于r - 为什么 ff 仍然将数据存储在 RAM 中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8900898/

    10-11 17:49