ffdf 对象消耗额外的 RAM(以 GB 为单位)
Posted
技术标签:
【中文标题】ffdf 对象消耗额外的 RAM(以 GB 为单位)【英文标题】:ffdf object consumes extra RAM (in GB) 【发布时间】:2016-02-03 10:38:16 【问题描述】:我决定测试 ff 包的关键优势 - RAM 最小分配(PC 规格:i5、RAM 8Gb、Win7 64 位、Rstudio)。
根据包描述,我们可以像虚拟对象一样操作物理对象(文件),就好像它们被分配到 RAM 中一样。因此,实际 RAM 使用量大大减少(从 Gb 到 kb)。我使用的代码如下:
library(ff)
library(ffbase)
setwd("D:/My_package/Personal/R/reading")
x<-cbind(rnorm(1:100000000),rnorm(1:100000000),1:100000000)
system.time(write.csv2(x,"test.csv",row.names=FALSE))
system.time(x <- read.csv2.ffdf(file="test.csv", header=TRUE, first.rows=100000, next.rows=100000000,levels=NULL))
print(object.size(x)/1024/1024)
print(class(x))
实际文件大小为 4.5 Gb,实际使用的 RAM 以这样的方式变化(通过任务管理器):2,92 -> 上限(~8Gb)-> 5.25Gb。 对象大小(通过 object.size())约为 12 kb。
我担心 RAM 额外分配(~2.3 GB)。根据包描述,它应该只增加了 12 kb。我不使用任何字符。
也许我错过了一些 ff 包。
【问题讨论】:
【参考方案1】:嗯,我找到了一个解决方案来消除额外 RAM 的使用。
首先要注意ff包中方法'read.table.ffdf'的'first.rows'和'next.rows'等参数。
第一个参数('first.rows')规定了初始块的行数,它规定了初始内存分配。我使用了默认值(1000 行)。
额外的内存分配是第二个参数('next.rows')的主题。如果您想在没有额外 RAM 分配的情况下拥有 ffdf 对象(在我的情况下 - 以 Gb 为单位),那么您需要为下一个块选择如此多的行,使得块的大小不应超过 'getOption("ffbatchbytes ")'。
在我的例子中,我使用了“first.rows=1000”和“next.rows=1000”,并且任务管理器中的总 RAM 分配变化高达 1Mb。 'next.rows' 增加到 10000 导致 RAM 增长了 8-9 Mb。
所以这个参数要根据你的实验来挑选最好的比例。
此外,您必须记住,'next.rows' 的增加会影响 ffdf 对象的处理时间(通过多次运行):
'first.rows=1000' 和 'next.rows=1000' 大约是 1500 秒。 (RAM ~ 1Mb) 'first.rows=1000' 和 'next.rows=10000' 大约是 230 秒。 (RAM ~ 9Mb)
【讨论】:
以上是关于ffdf 对象消耗额外的 RAM(以 GB 为单位)的主要内容,如果未能解决你的问题,请参考以下文章
6.5 GB 文件上的 Pandas read_csv 消耗超过 170 GB RAM
Scikit Learn 为 70 万个具有 2 列(纬度和经度)的数据点实施 DBSCAN 消耗 128GB+ RAM。如何解决这个内存问题?