Fastest way to read large Excel xlsx files? To parallelize or not?

后端 未结 2 1664
梦毁少年i
梦毁少年i 2020-12-18 00:24

My questions are:

  • What is the fastest way to read large(ish) .xlsx Excel files into R? 10 to 200 MB xlsx files, with multiple sheets.

2条回答
  •  一整个雨季
    2020-12-18 01:00

    You could try to run it in parallel using the parallel package, but it is a bit hard to estimate how fast it will be without sample data:

    library(parallel)
    library(readxl)
    
    excel_path <- ""
    sheets <- excel_sheets(excel_path)
    

    Make a cluster with a specified number of cores:

    cl <- makeCluster(detectCores() - 1)
    

    Use parLapplyLB to go through the excel sheets and read them in parallel using load balancing:

    parLapplyLB(cl, sheets, function(sheet, excel_path) {
      readxl::read_excel(excel_path, sheet = sheet)
    }, excel_path)
    

    You can use the package microbenchmark to test how fast certain options are:

    library(microbenchmark)
    
    microbenchmark(
      lapply = {lapply(sheets, function(sheet) {
        read_excel(excel_path, sheet = sheet)
      })},
      parralel = {parLapplyLB(cl, sheets, function(sheet, excel_path) {
        readxl::read_excel(excel_path, sheet = sheet)
      }, excel_path)},
      times = 10
    )
    

    In my case, the parallel version is faster:

    Unit: milliseconds
         expr       min        lq     mean    median        uq      max neval
       lapply 133.44857 167.61801 179.0888 179.84616 194.35048 226.6890    10
     parralel  58.94018  64.96452 118.5969  71.42688  80.48588 316.9914    10
    

    The test file contains of 6 sheets, each containing this table:

        test test1 test3 test4 test5
     1     1     1     1     1     1
     2     2     2     2     2     2
     3     3     3     3     3     3
     4     4     4     4     4     4
     5     5     5     5     5     5
     6     6     6     6     6     6
     7     7     7     7     7     7
     8     8     8     8     8     8
     9     9     9     9     9     9
    10    10    10    10    10    10
    11    11    11    11    11    11
    12    12    12    12    12    12
    13    13    13    13    13    13
    14    14    14    14    14    14
    15    15    15    15    15    15
    

    Note: you can use stopCluster(cl) to shut down the workers when the process is finished.

提交回复
热议问题