Мониторинг памяти и управление ею

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

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 мегабайта памяти; планирование мультисессии — 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...