R - 通过块读取csv并行处理它们

时间:2017-06-07 09:49:02

标签: r parallel-processing chunks

如何通过块读取CSV文件(其大小太大而无法读取一次),并使用parallel包处理所有块?让我们说我想用块来计算列的平均值。

没有parallel我会使用这样的东西:

library(readr)

f <- function(df_chunk, pos) mean(df_chunk$'mpg')

res <- read_csv_chunked(readr_example("mtcars.csv"), DataFrameCallback$new(f), chunk_size=10)

结果是:

> res
      [,1]
[1,] 20.37
[2,] 19.89
[3,] 20.39
[4,] 18.20

所以我想通过子进程计算这4个平均值。实现这一目标的一些代码可能是这样的:

library(foreach)
library(doParallel)

registerDoParallel(6)

calc_avg <- function (iterable_df_chunks) {
  foreach(df_chunk = iterable_df_chunks, .combine = c) %dopar%
    mean(df_chunk$'mpg')
}

calc_avg(< some code with read_csv_chunked() >)

stopImplicitCluster()

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个有效的解决方案。函数load_CPU仅进行一些CPU密集型计算,以检查子进程是否真正完成了这项任务:

load_CPU <- function(n){
  i=3
  v=c(2)
  while (length(v)<=n-1){

    if (all((i%%v[v<ceiling(sqrt(i))])!=0)){ 
      v=c(v,i)
    }
    i=i+2;
  }
  return(v)
}

calc_avg <- function (path) foreach(y = read_csv_chunked(path, ListCallback$new(function (x, pos) x),
    chunk_size = 10), .combine = rbind, .export=c('load_CPU')) %dopar% {
        load_CPU(10000)
        mean(y$'mpg')
    }

calc_avg(readr_example("mtcars.csv"))

结果是:

          [,1]
result.1 20.37
result.2 19.89
result.3 20.39
result.4 18.20