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。如何解决这个内存问题?

加载 ffdf 数据占用大量内存

Tomcat 内存消耗

ffdf对象列表的序列化

在运行时获取程序 RAM 使用情况(以 MB 为单位)(Windows 10)[重复]