使用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回归仍然发出错误。
答案 0 :(得分:4)
你需要以biglm的形式提供数据,请参阅?biglm。 如果传递ffdf对象而不是data.frame,则会遇到以下两个问题之一:
检查?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
最好的, 米格尔。