gpt4 book ai didi

r - 读取大型 Excel xlsx 文件的最快方法?并行化与否?

转载 作者:行者123 更新时间:2023-12-04 17:42:55 47 4
gpt4 key购买 nike

我的问题是:

  • 将大型(ish).xlsx Excel 文件读入 R 的最快方法是什么? 10 到 200 MB xlsx 文件,包含多张工作表。
  • 可以使用某种并行处理 ,例如每个核心阅读
    多页 Excel 文件的单独表格?
  • 是否可以执行任何其他类型的优化?

  • 到目前为止我所了解的(以及我尚未了解的):
  • 如果像我一样从旋转磁盘读取,并行处理实际上可能会减慢读取速度,因为多个进程尝试从同一个文件中读取。但是,并行过程可能有助于转换和推断数据类型之类的事情?不确定 readxl 从磁盘读取(我假设是 IO 绑定(bind))与转换数据类型(我猜是 CPU 绑定(bind))花费了多少。
  • 这可能与 SSD 驱动器不同。如果有很大的改进,我可能会将数据复制到 SSD 驱动器并从那里读取。
  • data.table::fread 加快了文本文件的读取速度(虽然我不完全理解为什么)但它不能用于 excel 文件 - 或者可以吗?
  • 我由此了解 answerreadxl往往比 openxlsx

  • 我只对表格数据感兴趣;我对 Excel 格式不感兴趣,也不对图表、文本标签或任何其他类型的数据感兴趣。

    我可能希望导入 tidyverse tibbles,但不一定。然后,我需要将表导出到 Microsoft SQL Server。

    一些背景知识:我主要使用 Python 并且对 R 完全陌生。 在 Python 中读取大型 Excel 文件非常缓慢。 我已经看到 R 的 readxl比 Python 的 pandas 快得多(在 15 张 xlsx 上,每张纸有 10,000 行和 32 列:readxl 为 5.6 秒,pandas 为 33 秒),太棒了!但是,我仍然想了解是否有任何方法可以使导入更快。我可以 使用 R 读取文件,将它们导出到 SQL,然后使用 Python 从 SQL 读取继续我的工作流程的其余部分。

    我不认为转换为 CSV 是最佳选择 ,尤其是当 readxl 无论如何都比 Python 快得多的时候;基本上转换为 csv 可能比我通过读取 csv 而不是 excel 节省的时间要长。另外,至少在 Python 中(我对 R 的了解还不够,无法用 readxl 彻底测试),使用 xlsx 推断数据类型比使用 csv 更好。

    我的代码(任何批评或建议都非常受欢迎):
    library(readxl)
    library(tidyverse)
    library(tictoc)


    this.dir <- dirname(parent.frame(2)$ofile)
    setwd(this.dir)

    tic("readxl")

    path <- "myfile.xlsx"
    sheetnames <- excel_sheets(path)
    mylist <- lapply(excel_sheets(path), read_excel, path = path)

    names(mylist) <- sheetnames
    toc()

    最佳答案

    您可以尝试使用 parallel 并行运行它。包,但是在没有样本数据的情况下很难估计它的速度:

    library(parallel)
    library(readxl)

    excel_path <- ""
    sheets <- excel_sheets(excel_path)

    创建具有指定核心数的集群:
    cl <- makeCluster(detectCores() - 1)

    使用 parLapplyLB浏览 excel 表并使用负载平衡并行读取它们:
    parLapplyLB(cl, sheets, function(sheet, excel_path) {
    readxl::read_excel(excel_path, sheet = sheet)
    }, excel_path)

    您可以使用包 microbenchmark测试某些选项的速度有多快:
    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
    )

    就我而言,并行版本更快:
    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

    测试文件包含 6 张表,每张表都包含以下表格:
        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

    笔记:
    您可以使用 stopCluster(cl)当过程完成时关闭工作人员。

    关于r - 读取大型 Excel xlsx 文件的最快方法?并行化与否?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55513145/

    47 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com