如何通过块读取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()
谢谢!
答案 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