合并大数据帧多次耗尽内存

Zeu*_*eus 5 r out-of-memory left-join dplyr

我试图两次过滤大数据帧(DF1 and DF2),然后将两个过滤的数据帧合并(DF1+DF2->DF3)多次到一个数据帧,并将结果合并到一个数据帧中(DF=DF3[1]+DF3[2]...DF[n]),但是内存不足(8Gb).初始和最终数据框架可轻松放在笔记本电脑上,因此其处理耗尽内存.

什么方法最快,需要最少的内存?我应该在部分中运行代码并重新组合,获得更大的枪,还是这是关系数据库的工作MapReduce

下面的代码说明了这个问题.

#create combination df
Combn <- data.frame(t(combn(as.vector(rep(LETTERS[1:26])),2))) %>% 
  mutate_all(as.character)

#create data df
Nrows <- 1000000
Data <- data.frame(Symbol=rep(LETTERS[1:26])) %>% 
  mutate(Symbol=as.character(Symbol)) %>% 
  bind_rows(replicate(Nrows-1,.,simplify=FALSE)) %>% 
  arrange(Symbol) %>% 
  group_by(Symbol) %>% 
  mutate(Idx=seq(1:Nrows)) %>% 
  mutate(Px=round(runif(Nrows)*20)) 

FnPDList <- function(Combn,Data){      
  Dfs <- list()      
  for(i in 1:nrow(Combn)){
    print(i)
    Symbol.1 <- Combn$X1[i]
    Symbol.2 <- Combn$X2[i]

    Sym.2 <- Data %>% 
      filter(Symbol==Symbol.2) 

    Df <- Data %>% 
      filter(Symbol==Symbol.1) %>%
      left_join(Sym.2,by="Idx",suffix=c(".1",".2"))

    Dfs[[i]] <- Df
  }      
  return(Dfs)
}

#splitting into n parts works
X <- FnPDList(slice(Combn,1:10),Data)
Z <- do.call(bind_rows,X) 

#trying to solve in one go exhausts memory
X <- FnPDList(Combn,Data)
Z <- do.call(bind_rows,X) 
Run Code Online (Sandbox Code Playgroud)