Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 多次合并大数据帧会耗尽内存_R_Dplyr_Out Of Memory_Left Join - Fatal编程技术网

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

R 多次合并大数据帧会耗尽内存,r,dplyr,out-of-memory,left-join,R,Dplyr,Out Of Memory,Left Join,我尝试对一个大数据帧进行两次过滤(DF1和DF2),然后多次将两个过滤后的数据帧合并为一个数据帧(DF1+DF2->DF3),并将结果合并为一个数据帧(DF=DF3[1]+DF3[2]…DF[n]),但内存一直不足(8Gb)。初始和最终的数据帧很容易放在笔记本电脑上,因此处理过程会耗尽内存 什么方法最快,需要最少的内存?我应该分部分运行代码并重新组合,获得更大的枪,还是这是关系数据库或MapReduce的工作 下面的代码说明了这个问题 #create combination df Combn &

我尝试对一个大数据帧进行两次过滤
(DF1和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) 
#创建组合df
精梳%
全部变异(如字符)
#创建数据df
Nrows%
绑定行(复制(Nrows-1,simplify=FALSE))%>%
排列(符号)%%>%
分组依据(符号)%>%
突变(Idx=seq(1:Nrows))%>%
变异(Px=圆形(runif(Nrows)*20))

FnPDList看一看data.table,使用过而且性能非常好。谢谢,我来看看,数据表的内存效率是否更高?我建议使用云服务,例如GCP。16Cores104GB内存虚拟机的实例每小时不需要花费我一美元。谢谢,是的,这是可行的,但如果可能的话,我更喜欢笔记本电脑类型的解决方案。我认为
数据。table::merge
可以在常规
数据上使用。帧
无需转换,而且性能更好