簡體   English   中英

R-通過塊讀取csv並行處理它們

[英]R - read csv by chunks process them in parallel

如何按塊讀取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()

謝謝!

好的,我找到了可行的解決方案。 函數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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM