1

我有一个 20M 行的大型 data.frame。这个数据框不仅是数字,还有字符。使用拆分和征服的概念,我想拆分这个数据帧以使用雪包(特别是 parLapply 函数)以并行方式执行。问题是节点内存不足,因为数据帧部分是在 RAM 中工作的。我寻找了一个包来帮助我解决这个问题,但我只找到了一个(考虑到多类型 data.frame):ff 包。另一个问题来自于这个包的使用。ffdf的拆分结果不等于commom data.frame的拆分。因此,无法运行 parLapply 函数。

你知道这个目标的其他包吗?Bigmemory 仅支持矩阵。

4

1 回答 1

0

我已经对一些拆分数据帧和并行化的方法进行了基准测试,以了解它们对大型数据帧的有效性。这可能会帮助您处理 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 是数据框/表
  • kNoCores(在这种情况下 = 25)是核心数

    1. 分布式内存。将 coord.table 发送到所有节点
    2. 共享内存。与节点共享 coord.table
    3. 共享内存与削减。与节点共享 coord.table 的子集。
    4. 与削减相提并论。将 coord.table 的子集发送到节点。
    5. 雪与削减和进度条。将 coord.table 的子集发送到节点
    6. 选项 5 无进度条

可以在此处找到有关我比较的其他选项的更多信息。

其中一些答案可能适合您,尽管它们与分布式 parlapply 无关,我已将其中一些包含在我的基准测试选项中。

于 2017-07-27T20:18:27.410 回答