Övervaka och hantera minne

Parallell programmering i R

Nabeel Imam

Data Scientist

Kön och utrymmet

Tre banktjänstemän betjänar kunder vid disken medan andra kunder väntar på sin tur.

Parallell programmering i R

Det parallella flödet

Ett parallellt flöde visas där en uppgift delas upp i flera mindre deluppgifter. Dessa deluppgifter utförs av olika kärnor och resultaten kombineras.

Parallell programmering i R

Det parallella flödet

Det parallella arbetsflödet ligger i arbetsminnet (RAM).

Parallell programmering i R

Födelsedata

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"
...
Parallell programmering i R

Mappning med 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
   ...
...
Parallell programmering i R

Profilering med två workers

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

Profileringsutdata från profvis-funktionen. Att läsa CSV-filer parallellt med två workers via future_map använder 1,6 megabyte minne, medan övriga kodrader inte registrerar någon användning.

Parallell programmering i R

Profilering med fyra workers

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

Profileringsutdata från profvis-funktionen. Att läsa CSV-filer parallellt med fyra workers via future_map använder 3,1 megabyte minne, medan planeringen av multisession använder 0,3 megabyte.

Parallell programmering i R

Bakom kulisserna

En karta över USA indelad i fyra regioner: Väst, Mellanvästern, Södern och Nordost. Varje region motsvarar en lista med CSV-filer som innehåller data för delstaterna i regionen.

Parallell programmering i R

Hantera minne med chunkning

config <- furrr_options(chunk_size = 26)

plan(multisession, workers = 4) ls_df <- future_map(ls_files, read.csv,
.options = config) plan(sequential)
Parallell programmering i R

Hantera minne med chunkning

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

Profileringsutdata från profvis-funktionen. Att läsa CSV-filer parallellt med fyra workers via future_map använder 2,5 megabyte minne med en chunk-storlek på 26.

Parallell programmering i R

Chunkning med parallel

cl <- makeCluster(4)


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

Att läsa CSV-filer parallellt med parLapply använder 2,4 megabyte minne, allt i själva parLapply-anropet.

Parallell programmering i R

Chunkning med parallel

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

chunk.size = 26)
stopCluster(cl)

Att läsa CSV-filer parallellt med parLapply använder bara 1 megabyte minne när chunk-storleken är satt till 26.

Parallell programmering i R

När ska man chunka?

  • Chunkning utförs optimalt som standard
  • Med stora dataobjekt och lågt minne
    • Prova med färre kärnor om möjligt
    • Testa några olika chunk-storlekar för att hitta optimum
Parallell programmering i R

Nu kör vi en övning!

Parallell programmering i R

Preparing Video For Download...