Ank*_*kit 5 r function apply large-data data.table
我有一个非常大Data Table的两列.我希望在特定列上应用自定义函数.生成问题的代码如下:
require(data.table)
X <- rep("This is just random text", 1e5)
data <- data.frame(1:1e5, replicate(1, X, simplify=FALSE), stringsAsFactors=FALSE)
colnames(data) <- paste("X", seq_len(ncol(data)), sep="")
DT <- as.data.table(data)
Run Code Online (Sandbox Code Playgroud)
现在,我们有一个大型数据表,看起来像
| X1 | X2 |
|----|-------------------------|
| 1 | This is just random text|
| 2 | This is just random text|
| 3 | This is just random text|
| 4 | This is just random text|
| .. | ... |
Run Code Online (Sandbox Code Playgroud)
如果我想在这个列的任何一个上做一些向量操作,考虑到这个data.table将是非常大的(大约~100M行),该怎么办?
我们来看一个X1列的例子.假设,我想在其上应用以下功能:
Fun4X1 <- function(x){return(x+x*2)}
Run Code Online (Sandbox Code Playgroud)
而NLPX2列上的一个非常复杂的函数看起来像
Fun4X2 <- function(x){
require(stringr)
return(str_split(x, " ")[[1]][1])
}
Run Code Online (Sandbox Code Playgroud)
我该如何为大型数据集执行此操作?请建议分钟.耗时的方法因为我Function本身非常复杂.
PS我试过foreach,sapply当然for-loop,在一个相当不错的硬件系统上都非常慢.
查看 Snowfall 包,http://cran.r-project.org/web/packages/snowfall/snowfall.pdf,用于并行计算。您可以设置本地集群并利用所有核心。我发现通过使用sfApply这个包,我的大部分计算时间减少了 5 倍
(我有8核,所以速度会快8倍,但显然存在将数据加载到集群并最后收集的成本)。
例如
install.packages('snowfall')
require(snowfall)
sfInit( parallel=TRUE, cpus=4 )
sfExport(list=c('DT','Fun4X1','Fun4X2'))
sfApply(DT,1,function(X) return(c(fun4X1(X[1]),fun4X2(X[2]))))
sfStop()
Run Code Online (Sandbox Code Playgroud)
在我的机器上需要 25.07 秒,需要9.11apply秒sfApply