Monitorowanie pamięci i zarządzanie nią

Programowanie równoległe w R

Nabeel Imam

Data Scientist

Kolejka i przestrzeń

Trzej kasjerzy obsługują klientów w banku, podczas gdy inni oczekują w kolejce.

Programowanie równoległe w R

Przepływ równoległy

Przedstawiony jest przepływ równoległy, w którym zadanie jest dzielone na mniejsze podzadania. Podzadania są wykonywane przez różne rdzenie, a wyniki są łączone.

Programowanie równoległe w R

Przepływ równoległy

Przepływ równoległy jest przechowywany w pamięci RAM.

Programowanie równoległe w R

Dane o urodzeniach

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"
...
Programowanie równoległe w R

Mapowanie z użyciem 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
   ...
...
Programowanie równoległe w R

Profilowanie z dwoma wątkami roboczymi

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

Wynik profilowania kodu z funkcji profvis. Równoległe odczytywanie plików CSV z dwoma wątkami roboczymi za pomocą future_map zużywa 1,6 megabajta pamięci, pozostałe linie kodu nie rejestrują żadnego zużycia.

Programowanie równoległe w R

Profilowanie z czterema wątkami roboczymi

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

Wynik profilowania kodu z funkcji profvis. Równoległe odczytywanie plików CSV z czterema wątkami roboczymi za pomocą future_map zużywa 3,1 megabajta pamięci, a planowanie multisession zużywa 0,3 megabajta.

Programowanie równoległe w R

Co dzieje się w tle

Mapa USA przedstawiająca kraj podzielony na cztery regiony: Zachód, Środkowy Zachód, Południe i Północny Wschód. Każdy region odpowiada liście plików CSV z danymi dla poszczególnych stanów.

Programowanie równoległe w R

Zarządzanie pamięcią przez podziały na fragmenty

config <- furrr_options(chunk_size = 26)

plan(multisession, workers = 4) ls_df <- future_map(ls_files, read.csv,
.options = config) plan(sequential)
Programowanie równoległe w R

Zarządzanie pamięcią przez podziały na fragmenty

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

Wynik profilowania kodu z funkcji profvis. Równoległe odczytywanie plików CSV z czterema wątkami roboczymi za pomocą future_map zużywa 2,5 megabajta pamięci przy rozmiarze fragmentu równym 26.

Programowanie równoległe w R

Podział na fragmenty z pakietem parallel

cl <- makeCluster(4)


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

Równoległe odczytywanie plików CSV za pomocą parLapply zużywa 2,4 megabajta pamięci – całość w wywołaniu parLapply.

Programowanie równoległe w R

Podział na fragmenty z pakietem parallel

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

chunk.size = 26)
stopCluster(cl)

Równoległe odczytywanie plików CSV za pomocą parLapply zużywa tylko 1 megabajt pamięci przy rozmiarze fragmentu równym 26.

Programowanie równoległe w R

Kiedy stosować podział na fragmenty?

  • Domyślnie podział na fragmenty jest wykonywany optymalnie
  • Przy dużych obiektach danych i niskim poziomie pamięci
    • Warto rozważyć użycie mniejszej liczby rdzeni
    • Proszę eksperymentować z różnymi rozmiarami fragmentów, aby znaleźć optimum
Programowanie równoległe w R

Let's practice!

Programowanie równoległe w R

Preparing Video For Download...