メモリの監視と管理

R による並列プログラミング

Nabeel Imam

Data Scientist

待ち行列と空き容量

銀行で3人の窓口係が対応し、他の客は順番待ちしている。

R による並列プログラミング

並列フロー

並列フロー。タスクを小さなサブタスクに分割し、各コアで実行して結果を統合。

R による並列プログラミング

並列フロー

並列ワークフローは RAM(主記憶)内で動作。

R による並列プログラミング

出生データ

print(ls_files)
 [1] "./births/AK.csv"
 [2] "./births/AL.csv"
 [3] "./births/AR.csv"
 [4] "./births/AZ.csv"
 [5] "./births/CA.csv"
 [6] "./births/CO.csv"
 [7] "./births/CT.csv"
 [8] "./births/DC.csv"
 [9] "./births/DE.csv"
 [10] "./births/FL.csv"
...
R による並列プログラミング

futures での mapping

plan(multisession, workers = 2)

ls_df <- future_map(ls_files, read.csv)
plan(sequential)
print(ls_df)
[[1]]
   state month plurality weight_gain_pounds mother_age
      AK     1         1                 30         43
   ...
[[2]]
   state month plurality weight_gain_pounds mother_age
      AL    10         1                 60         33
   ...
...
R による並列プログラミング

2 ワーカーでのプロファイリング

profvis({
  plan(multisession, workers = 2)
  ls_df <- future_map(ls_files, read.csv)
  plan(sequential)
})

profvis の出力。future_map で 2 ワーカー並列で CSV を読むと 1.6 MB を使用。その他の行は使用なし。

R による並列プログラミング

4 ワーカーでのプロファイリング

profvis({
  plan(multisession, workers = 4)
  ls_df <- future_map(ls_files, read.csv)
  plan(sequential)
})

profvis の出力。future_map で 4 ワーカー並列で CSV を読むと 3.1 MB を使用。multisession の plan で 0.3 MB 使用。

R による並列プログラミング

舞台裏

米国地図を西部・中西部・南部・北東部の4地域に分割。各地域に、その地域の州ごとの CSV リストが対応。

R による並列プログラミング

チャンクでメモリを管理

config <- furrr_options(chunk_size = 26)

plan(multisession, workers = 4) ls_df <- future_map(ls_files, read.csv,
.options = config) plan(sequential)
R による並列プログラミング

チャンクでメモリを管理

profvis({
  config <- furrr_options(chunk_size = 26)
  plan(multisession, workers = 4)
  ls_df <- future_map(ls_files, read.csv,
             .options = config)
  plan(sequential)
})

profvis の出力。4 ワーカーで chunk_size=26 の future_map により 2.5 MB を使用。

R による並列プログラミング

parallel でのチャンク処理

cl <- makeCluster(4)


ls_df <- parLapply(cl, ls_files, read.csv)
stopCluster(cl)

parLapply で並列に CSV を読むと 2.4 MB を使用。すべて parLapply 呼び出しで発生。

R による並列プログラミング

parallel でのチャンク処理

cl <- makeCluster(4)
ls_df <- parLapply(cl, ls_files, read.csv,

chunk.size = 26)
stopCluster(cl)

parLapply で chunk.size=26 にすると、メモリ使用は 1 MB のみ。

R による並列プログラミング

いつチャンクするか

  • チャンクは既定で最適化済み
  • 大きなデータでメモリ不足のとき
    • 可能ならコア数を減らす
    • 最適化のため複数のチャンクサイズを試す
R による並列プログラミング

練習しましょう!

R による並列プログラミング

Preparing Video For Download...