如何在ff包的fpdf对象中进行算术运算

Posted

技术标签:

【中文标题】如何在ff包的fpdf对象中进行算术运算【英文标题】:how to make arithmatic operations in ffdf object of ff package 【发布时间】:2016-02-04 16:59:36 【问题描述】:

我有制作 ffdf 对象的脚本:

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=1000, next.rows=10000,levels=NULL)) 

现在我想将 x 的第 1 列增加 5。 为了执行这样的操作,我使用了 ff 包的方法 'add()':

add(x[,1],5)

输出正常(第 1 列增加 5)。但是额外的 RAM 分配是灾难性的 - 看起来好像我在 RAM 中操作整个数据帧而不是 ffdf 对象。

所以我的问题是关于在没有大量额外 RAM 分配的情况下处理 ffdf 对象元素的正确方法。

【问题讨论】:

【参考方案1】:

你可以这样做

require(ffbase)

x <- ff(1:10)
y <- x + 5
x
y

ffbase 已算出所有算术运算请参阅 help("+.ff_vector")

【讨论】:

@jwijffels:非常感谢。我会更加关注这个包。【参考方案2】:

我已经使用块方法进行算术计算而没有额外的 RAM 开销(请参阅问题部分中的初始脚本):

chunk_size<-100
m<-numeric(chunk_size)
chunks <- chunk(x, length.out=chunk_size)

system.time(
    for(i in seq_along(chunks))
      x[chunks[[i]],][[1]]<-x[chunks[[i]],][[1]]+5
    
)
x

现在,我将 x 对象的第 1 列的每个元素增加了 5,而没有大量的 RAM 分配。

“chunk_size”也调节块的数量 -> 使用的块越多,RAM 开销就越小。但可能会出现处理时间问题。

ffdf中关于chunk的简单例子和解释在这里:https://github.com/demydd/R-for-Big-Data/blob/master/09-ff.Rmd

无论如何,很高兴听到其他方法。

【讨论】:

以上是关于如何在ff包的fpdf对象中进行算术运算的主要内容,如果未能解决你的问题,请参考以下文章

shell中如何进行算术运算

如何使用括号进行算术运算

算术和关系运算符

如何使用 web3.js 在 Truffle 测试中进行基本算术运算

如何在 Rust Diesel 中使用时间戳和间隔进行算术运算

76.算术运算符