本质上,我有一个大的数据帧: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)