如何在 Snow R 中使用大型多类型数据框?
How to work with a large multi type data frame in Snow R?
我有一个很大的 data.frame 20M 行。这个数据框不仅是数字,还有字符。使用分而治之的概念,我想使用 snow 包(特别是 parLapply 函数)拆分这个数据帧以并行方式执行。问题是节点 运行 内存不足,因为数据框部分在 RAM 中工作。我寻找一个包来帮助我解决这个问题,但我只找到了一个(考虑到多类型 data.frame):ff 包。另一个问题来自这个包的使用。一个ffdf的拆分结果不等于一个commom的拆分结果data.frame。因此,运行 parLapply 函数是不可能的。
你知道这个目标的其他套餐吗? Bigmemory 只支持矩阵。
我已经对一些拆分数据帧和并行化的方法进行了基准测试,以了解它们对大型数据帧的有效性。这可能会帮助你处理 20M 线的数据帧,而不需要另一个包。
结果出来了。说明如下。
这表明对于大型数据帧,最好的选择是(不是最快的,但有一个进度条):
library(doSNOW)
library(itertools)
# if size on cores exceeds available memory, increase the chunk factor
chunk.factor <- 1
chunk.num <- kNoCores * cut.factor
tic()
# init the cluster
cl <- makePSOCKcluster(kNoCores)
registerDoSNOW(cl)
# init the progress bar
pb <- txtProgressBar(max = 100, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
# conduct the parallelisation
travel.queries <- foreach(m=isplitRows(coord.table, chunks=chunk.num),
.combine='cbind',
.packages=c('httr','data.table'),
.export=c("QueryOSRM_dopar", "GetSingleTravelInfo"),
.options.snow = opts) %dopar% {
QueryOSRM_dopar(m,osrm.url,int.results.file)
}
# close progress bar
close(pb)
# stop cluster
stopCluster(cl)
toc()
注意
- coord.table就是数据frame/table
kNoCores(本例中=25)是核心数
- 分布式内存。发送coord.table到所有节点
- 共享内存。与节点
共享 coord.table
- 有削减的共享内存。与节点共享 coord.table 的子集。
- 与削减相提并论。将 coord.table 的子集发送到节点。
- SNOW 有剪辑和进度条。将 coord.table 的子集发送到节点
- 没有进度条的选项5
可以找到有关我比较的其他选项的更多信息 here。
these answers 中的一些可能适合您,尽管它们与分布式 parlapply 无关,我已将其中一些包含在我的基准测试选项中。
我有一个很大的 data.frame 20M 行。这个数据框不仅是数字,还有字符。使用分而治之的概念,我想使用 snow 包(特别是 parLapply 函数)拆分这个数据帧以并行方式执行。问题是节点 运行 内存不足,因为数据框部分在 RAM 中工作。我寻找一个包来帮助我解决这个问题,但我只找到了一个(考虑到多类型 data.frame):ff 包。另一个问题来自这个包的使用。一个ffdf的拆分结果不等于一个commom的拆分结果data.frame。因此,运行 parLapply 函数是不可能的。
你知道这个目标的其他套餐吗? Bigmemory 只支持矩阵。
我已经对一些拆分数据帧和并行化的方法进行了基准测试,以了解它们对大型数据帧的有效性。这可能会帮助你处理 20M 线的数据帧,而不需要另一个包。
结果出来了。说明如下。
这表明对于大型数据帧,最好的选择是(不是最快的,但有一个进度条):
library(doSNOW)
library(itertools)
# if size on cores exceeds available memory, increase the chunk factor
chunk.factor <- 1
chunk.num <- kNoCores * cut.factor
tic()
# init the cluster
cl <- makePSOCKcluster(kNoCores)
registerDoSNOW(cl)
# init the progress bar
pb <- txtProgressBar(max = 100, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
# conduct the parallelisation
travel.queries <- foreach(m=isplitRows(coord.table, chunks=chunk.num),
.combine='cbind',
.packages=c('httr','data.table'),
.export=c("QueryOSRM_dopar", "GetSingleTravelInfo"),
.options.snow = opts) %dopar% {
QueryOSRM_dopar(m,osrm.url,int.results.file)
}
# close progress bar
close(pb)
# stop cluster
stopCluster(cl)
toc()
注意
- coord.table就是数据frame/table
kNoCores(本例中=25)是核心数
- 分布式内存。发送coord.table到所有节点
- 共享内存。与节点 共享 coord.table
- 有削减的共享内存。与节点共享 coord.table 的子集。
- 与削减相提并论。将 coord.table 的子集发送到节点。
- SNOW 有剪辑和进度条。将 coord.table 的子集发送到节点
- 没有进度条的选项5
可以找到有关我比较的其他选项的更多信息 here。
these answers 中的一些可能适合您,尽管它们与分布式 parlapply 无关,我已将其中一些包含在我的基准测试选项中。