为什么ff仍然将数据存储在RAM中?

时间:2012-01-17 20:00:23

标签: r memory-management

使用ff package of R,我将一个csv文件导入到ffdf对象中,但很惊讶地发现该对象占用了大约700MB的RAM。是不是应该将数据保存在磁盘上而不是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仍然耗尽了超过700MB的内存,biglm回归仍然发出错误。

3 个答案:

答案 0 :(得分:4)

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

  1. ffdf不是data.frame,因此发生了一些未定义的事情
  2. 您传递的函数尝试将ffdf转换为data.frame,例如: as.data.frame(ffdf),这很容易耗尽你的RAM,这很可能是你发生的事情
  3. 检查?chunk.ffdf,了解如何将块从ffdf传递给biglm。

答案 1 :(得分:2)

ff包使用内存映射来根据需要将部分数据加载到内存中。

但似乎通过调用object.size,你实际上强制将整个事物加载到内存中!这就是警告信息似乎表明......

所以不要这样做......使用任务管理器(Windows)或顶级命令(Linux)来查看R进程在加载数据之前和之后实际使用了多少内存。

答案 2 :(得分:0)

我遇到了同样的问题,并发布了一个问题,您的问题可能有解释。 当您读取文件时,字符行被视为因子,如果存在许多唯一级别,则它们将进入RAM。 ff似乎总是将因子级别加载到RAM中。看到这个 在我的问题中从jwijffels回答:

Loading ffdf data take a lot of memory

最好的, 米格尔。