&引用;foreach“;R中的包装不能正常使用;ff";包裹

&引用;foreach“;R中的包装不能正常使用;ff";包裹,r,foreach,R,Foreach,我正在研究R中有1800万条记录的数据。我的计算机没有大量可用的RAM,所以我尝试使用“ff”软件包进行补偿。为了使时间合理,我还使用了“foreach”包并并行运行该作业。我在运行“foreach”与完整数据并行时遇到问题;较小的数据组(比如前10万行)运行正常 我试图获得的是基于日期的人们价值观的滚动日平均值。我想要过去7天、28天、91天等的平均每日值。我对R比较陌生,所以我不理解它的细微差别。当我在完整数据上运行此命令时,它会在一小时后停止,并给出错误: 任务1失败-找不到对象“Pers

我正在研究R中有1800万条记录的数据。我的计算机没有大量可用的RAM,所以我尝试使用“ff”软件包进行补偿。为了使时间合理,我还使用了“foreach”包并并行运行该作业。我在运行“foreach”与完整数据并行时遇到问题;较小的数据组(比如前10万行)运行正常

我试图获得的是基于日期的人们价值观的滚动日平均值。我想要过去7天、28天、91天等的平均每日值。我对R比较陌生,所以我不理解它的细微差别。当我在完整数据上运行此命令时,它会在一小时后停止,并给出错误:

任务1失败-找不到对象“PersonID”

如何将“ff”包与“foreach”包一起正确使用。另外,如果有某种方法可以将数据输出到ff数据帧中,然后再输出到SQL中,那就太好了。代码如下:

library("ff")
library("ffbase")
library("RODBC")
myconn <- odbcConnect("NO SHOW")
data <- as.ffdf(sqlFetch(myconn, "NO SHOW"))
#data[data=="NULL"] <- NA
#persons <- unique(data$PersonID, incomparables=FALSE)
persons <- aggregate(Value ~ PersonID, data=data, FUN=length)$PersonID

rollingLength <- 7
rollingTimes <- c(7,28,91,182,364,728,100000000)
valueCol <- 6
sinceCol <- 4

func <- function(stuff,id) {

check <- subset(stuff, PersonID == id)

tempvalue <- data.frame(matrix(,nrow=nrow(check),ncol=7,byrow=TRUE))

colnames(tempvalue) <- c("value7","value28","value91","value182","value364","value728","valueLTD")

tempvalue[1,] <- c(NA,NA,NA,NA,NA,NA,NA)
rollingTrips <- c(1,1,1,1,1,1,1)
rollingSinceLast <- c(0,0,0,0,0,0,0)
startIndex <- c(1,1,1,1,1,1,1)
rollingvalues <- c(0,0,0,0,0,0,0)
rollingvalues[1:rollingLength] <- check[1,valueCol]

if (nrow(check) > 1) {

for (r in 2:nrow(check)) {

    tempvalue[r,] <- rollingvalues / rollingTrips
    rollingvalues <- rollingvalues + check[r,valueCol]
    rollingTrips <- rollingTrips + 1
    rollingSinceLast <- rollingSinceLast + ifelse(is.na(check[r,sinceCol]), 0, check[r,sinceCol])

    for (c in 1:(rollingLength-1)) {

        while (rollingSinceLast[c] >= rollingTimes[c]) {
            rollingvalues[c] <- rollingvalues[c] - check[startIndex[c],valueCol]
            rollingTrips[c] <- rollingTrips[c] - 1
            rollingSinceLast[c] <- rollingSinceLast[c] - check[startIndex[c]+1,sinceCol]
            startIndex[c] <- startIndex[c] + 1
        }

    }

}

}

return (cbind(check, tempvalue))

}

library(foreach)
library(doParallel)

cl<-makeCluster(12)
registerDoParallel(cl)

strt<-Sys.time()
outdata <- foreach(id=persons, .combine="rbind", .packages="ff") %dopar% func(data,id)
print(Sys.time()-strt)

stopCluster(cl)

sqlSave(myconn, outdata)
odbcClose(myconn)
库(“ff”)
图书馆(“ffbase”)
图书馆(“RODBC”)

myconn
foreach
包的
%dopar%
命令需要键值的边界。 您可以简单地拆分您的
personID
。此外,还应将
分区
值设置为小于
makeCluster()
。如果不这样做,则会得到
文件。访问(文件名,0)=0不是真的。因为,您无法访问同一集群上预先保存的
ff
包文件

拆分
personID
示例:

split_min<-min(persons$personID)
split_max<-max(persons$personID)
partition<-12  # "partition < cluster" is good.
quart_half<-floor((split_max-split_min)/partition)
split_num<-matrix(0,partition,2)
split_num[1,1]<-split_min
split_num[1,2]<-quart_half+split_min
if(partition>=3){
for(i in 2:(partition-1)){
  split_num[i,1]<-split_num[i-1,2]+1
  split_num[i,2]<-split_num[i-1,2]+quart_half
}}
split_num[partition,1]<-split_num[partition-1,2]+1
split_num[partition,2]<-split_max
或者


outdata您使用的是什么操作系统
foreach
在Windows上的行为与在Linux和OS X上的不同?另外,您运行的是哪个版本的R,您使用的是哪个版本的软件包?我不知道你的问题的答案,但这些信息将有助于其他试图解决你的问题的人;根据第3.1.2条的规定;3.1.2项下的ff;3.1.2下的钻头;3.1.2下的双平行;3.1.2下的迭代器
outdata <- foreach(i=1:partition, .combine="rbind", .packages="ff") %dopar% {
   IDs<-subset(persons,personID>=split_num[i,1] & personID<=split_num[i,1])$personID
   for(z in IDs){
     func(data,z)}
}
outdata <- foreach(i=1:partition, .combine="rbind") %dopar% {
  require(ff) #or require(ffbase)
  IDs<-subset(persons,personID>=split_num[i,1] & personID<=split_num[i,1])$personID
  for(z in IDs){
    func(data,z)}
}