R并行的大型数据帧转换



本质上,我有一个大的数据帧:10000000x900(行、列(,我正在尝试并行转换每列的类。最终结果需要是一个数据帧

到目前为止,我得到的是:

假设df是已经定义的数据帧,所有列都是数字类和字符类的混合

library(snow) 
cl=makeCluster(50,type="SOCK")
cl.out=clusterApplyLB(cl,df,function(x)factor(x,exclude=NULL))

cl.out是我想要的列表,除了我需要的是作为数据帧类

所以这就是我陷入困境的地方。。。我是否尝试将cl.out的所有元素组合成一个不并行的data.frame?(慢,时间是个问题(

我可以用不同的包实现其他东西吗?(foreach?(

我必须硬编码一些c才能有效地完成这项工作吗?

如有任何帮助,我们将不胜感激。

谢谢,

一个有用的范例是对所有列进行子集化和替换,将df视为类似的列表

df[] <- lapply(df, factor, exclude=NULL)

正如您对makeCluster的调用所暗示的那样,您真的在一台机器上有50个核心吗?如果您不在Windows计算机上,请使用parallel软件包和mclapply,而不是

library(parallel)
options(mc.cores=50)
df[] <- mclapply(df, factor, exclude=NULL)

这真的能帮助你进行全面评估吗?分发和检索数据的成本似乎与进行计算的成本一样高。

> f = factor(rep("M", 10000000), levels=LETTERS)
> df = data.frame(f, f, f, f, f, f, f, f)
> system.time(lapply(df, factor, exclude=NULL))
   user  system elapsed 
  2.676   0.564   3.250 
> system.time(clusterApply(cl, df, factor, exclude=NULL))
   user  system elapsed 
  1.488   0.752   2.476 
> system.time(mclapply(df, factor, exclude=NULL))
   user  system elapsed 
  1.876   1.832   1.814 

(多核和多进程时序可能高度可变(。

如果你有这样大小的data.frame,我认为你会很快遇到内存问题

我认为它会更快、更高效。

您可以使用set

library(data.table)
# to set as a data.table without having to copy 
setattr(df, 'class', c('data.table','data.frame')
alloc.col(df)
for(nn in names(df)){
   set(df, j = nn, value = factor(df[[nn]])
 }

值得一读的数据表和并行计算

由于data.frame是一个列表,具有class属性,您可以将列表转换为data.frame,用CCD_ 9。

cl.out <- as.data.frame(cl.out)

我注意到列名丢失了:如果你确信它们是按照相同的顺序,您可以使用将它们设置回

names(cl.out) <- names(df)

相关内容

  • 没有找到相关文章

最新更新