0

到目前为止,我一直在使用 Sqldf 和 R 函数的组合来管理我的数据集。但是,我需要在大型数据集上执行一堆左连接,即使使用 sqldf dbname=tempfile(),我也会开始耗尽内存。

我注意到 FF 的第一件事是我无法将它传递给 sqldf。我注意到的第二件事是我的典型函数并不都在 ff 中工作。

我正常加入的例子

base <- read.csv(filename)
base <- sqldf("select * from base where DATE > 20120101")

for (j in list.files()){
   temp <- read.csv(tempfile)
   temp <- sqldf("select MATCH_KEY, DATE from temp")
   base <- sqldf("select * from base NATURAL LEFT OUTER JOIN temp")
 }

对于 ffbase,我不能简单地使用“as.ffdf(temp)”。解决方法是编写一个物理临时文件,然后将其作为 ff 读入,然后与 ff-s 进行合并。我觉得这不是与 ff 合作的好方法。有更好的选择吗?

我面临的第二个问题可能是由于我对 ff 不熟悉。我有一个简单的代码,只是不知道如何在 ff 中实现。基本上我有数据框基础,我想循环并计算值大于某个数字的次数。使用我的日期示例的想法(实际上我也在检查数字、比率等,但想法总是相同的)。

checks <- c(20010101,20020101,20030101)
summary <- matrix(0,ncol=dim(base)[2],nrow=length(checks))

for (i in checks){
  for (j in dim(base)[2]){
     summary[i,j]<-sum(base[,j]>=i)
}}

这些功能也不适用于 ff 。现在我实际上正在使用 sqldf 读取文件,然后写入一个临时文件。用 ff 读那些,然后做所有的合并业务。然后,我再次写入一个临时文件,并将其作为普通文件读回。哎呀!有什么改进建议吗?

[编辑]

一个大问题是,如何使用 as.ffdf 转换通过 sqldf (temp <-sqldf(stuff)) 创建的表。我收到一个错误:“ff 中的错误(initdata = initdata,长度 = 长度,级别 = 级别,有序 = 有序,:未实现 vmode '字符'”

此外,我似乎无法在 ff 中使用的两个函数示例。

1)我经常用 0 替换文件中的缺失值,以将它们与合并创建的缺失区分开来。我这样做是通过

   DF[is.na(DF)] <- 0

使用 ff 似乎涉及更多,我担心失去可读性:Replace NAs in a ffdf object

2)对列或行求和,寻找特定值。例如,计算“R”在列中出现的次数。在 ff?

4

1 回答 1

1

对于第一个问题。你为什么不这样做?

require(ffbase)
base <- read.csv.ffdf(filename)
open(base)
base <- subset(base, DATE > 20120101)

for (j in list.files()){
  temp <- read.csv.ffdf(tempfile, transFUN=function(x){
    x[c("MATCH_KEY","DATE")]
  })
  base <- merge(base, temp, by.x="MATCH_KEY", by.y="MATCH_KEY", all.x=TRUE)
}

为了使 sqldf 与 ffdf 对象一起工作,sqldf 中可能需要进行一些更改,即在它将数据从 ffdf 推送到 sqlite 的地方,这需要分块完成,这样它就不会溢出 RAM。此外,在 sqldf 中提取回 R 中的 ffdf 应该以不同的方式处理(可能通过使用来自 ETLUtils 的 read.dbi.ffdf) - 可能将此作为更改请求向 sqldf 包作者询问。

关于您的第二个问题,请务必展示您对 ff 的尝试以及您停止进一步尝试的地方。因为您在问题中指出的内容完全可以使用 ff。

于 2013-07-05T07:30:07.367 回答