Surveiller et gérer la mémoire

Programmation parallèle en R

Nabeel Imam

Data Scientist

La file et l'espace

Trois caissiers servent des clients dans une banque, tandis que d'autres attendent leur tour.

Programmation parallèle en R

Le flux parallèle

Un flux parallèle montre une tâche découpée en sous-tâches, exécutées par différents cœurs, puis réunies.

Programmation parallèle en R

Le flux parallèle

Le flux parallèle s'exécute dans la mémoire vive (RAM).

Programmation parallèle en R

Les données de naissances

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"
...
Programmation parallèle en R

Mappage avec 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
   ...
...
Programmation parallèle en R

Profilage avec deux travailleurs

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

Sortie de profilage produite par la fonction profvis. La lecture parallèle de fichiers CSV avec deux travailleurs via future_map utilise 1,6 Mo de mémoire, les autres lignes n'en enregistrent pas.

Programmation parallèle en R

Profilage avec quatre travailleurs

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

Sortie de profilage produite par la fonction profvis. La lecture parallèle de fichiers CSV avec quatre travailleurs via future_map utilise 3,1 Mo de mémoire, et la planification multisession utilise 0,3 Mo.

Programmation parallèle en R

En coulisses

Carte des États‑Unis divisée en quatre régions : Ouest, Midwest, Sud et Nord‑Est. Chaque région correspond à une liste de fichiers CSV par État.

Programmation parallèle en R

Gérer la mémoire par traitement par blocs

config <- furrr_options(chunk_size = 26)

plan(multisession, workers = 4) ls_df <- future_map(ls_files, read.csv,
.options = config) plan(sequential)
Programmation parallèle en R

Gérer la mémoire par traitement par blocs

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

Sortie de profilage produite par la fonction profvis. La lecture parallèle de fichiers CSV avec quatre travailleurs via future_map utilise 2,5 Mo de mémoire avec une taille de bloc de 26.

Programmation parallèle en R

Traitement par blocs avec parallel

cl <- makeCluster(4)


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

La lecture parallèle de fichiers CSV avec parLapply utilise 2,4 Mo de mémoire, entièrement dans l'appel à parLapply.

Programmation parallèle en R

Traitement par blocs avec parallel

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

chunk.size = 26)
stopCluster(cl)

La lecture parallèle de fichiers CSV avec parLapply n'utilise qu'1 Mo de mémoire lorsque la taille de bloc est 26.

Programmation parallèle en R

Quand traiter par blocs ?

  • Le traitement par blocs est optimal par défaut
  • Avec de gros objets et peu de mémoire
    • Essayez d'utiliser moins de cœurs si possible
    • Testez différentes tailles de blocs pour optimiser
Programmation parallèle en R

Passons à la pratique !

Programmation parallèle en R

Preparing Video For Download...