Моніторинг і керування пам'яттю

Паралельне програмування в R

Nabeel Imam

Data Scientist

Черга й простір

Троє касирів обслуговують клієнтів у банку, інші чекають у черзі.

Паралельне програмування в R

Паралельний потік

Показано паралельний потік: завдання поділене на менші підзавдання, які виконують різні ядра; результати об'єднуються.

Паралельне програмування в R

Паралельний потік

Паралельний робочий процес виконується в оперативній пам'яті.

Паралельне програмування в 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

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

Профілювання з двома виконавцями

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

Вивід профілювання коду з функції profvis. Паралельне читання CSV двома виконавцями через future_map використовує 1,6 МБ пам'яті; інші рядки не фіксують використання.

Паралельне програмування в R

Профілювання з чотирма виконавцями

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

Вивід профілювання коду з функції profvis. Паралельне читання CSV чотирма виконавцями через future_map використовує 3,1 МБ пам'яті; планування multisession — 0,3 МБ.

Паралельне програмування в R

Що відбувається всередині

Карта США, поділена на чотири регіони: Захід, Середній Захід, Південь і Північний Схід. Кожному регіону відповідає список 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. Паралельне читання CSV чотирма виконавцями через future_map використовує 2,5 МБ пам'яті за розміру чанка 26.

Паралельне програмування в R

Чанкування з parallel

cl <- makeCluster(4)


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

Паралельне читання CSV через parLapply використовує 2,4 МБ пам'яті; усе споживання відбувається у виклику parLapply.

Паралельне програмування в R

Чанкування з parallel

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

chunk.size = 26)
stopCluster(cl)

Паралельне читання CSV через parLapply використовує лише 1 МБ пам'яті, коли розмір чанка дорівнює 26.

Паралельне програмування в R

Коли застосовувати чанки?

  • Чанкування за замовчуванням виконується оптимально
  • Для великих об'єктів і браку пам'яті
    • За можливості спробуйте менше ядер
    • Поекспериментуйте з розмірами чанків, щоб знайти оптимум
Паралельне програмування в R

Давайте потренуємось!

Паралельне програмування в R

Preparing Video For Download...