2017-06-07 10 views
1

チャンクでCSVファイルを読み込むにはどうすればいいですか(そのサイズは一度に読むには大きすぎます)parallelパッケージを使用してすべてのチャンクを処理しますか?私は、チャンクによる列の平均を計算したいとしましょう。R - チャンクによるcsvを並列に処理する

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

いいえ、私は解決策を見つけました。

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 
機能 load_CPUは本当に子プロセスが仕事をすることを確認するために、いくつかのCPU集中的計算を行います
関連する問題