【发布时间】:2019-04-04 10:02:09
【问题描述】:
我的问题是:
将大型(ish).xlsx Excel 文件读入 R 的最快方法是什么? 10 到 200 MB xlsx 文件,多张纸。
可以使用某种并行处理,例如每个核心阅读 多页 Excel 文件的单独表格?
还有其他可以执行的优化吗?
到目前为止我所了解的(以及我尚未了解的):
- 如果从旋转磁盘读取,我会这样做,并行处理实际上可能会减慢读取速度,因为多个进程尝试从同一个文件中读取。但是,并行过程可能有助于转换和推断数据类型之类的事情?不确定 readxl 从磁盘读取(我假设是 IO 绑定)与转换数据类型(我猜是 CPU 绑定)花费了多少。
- 这可能与 SSD 驱动器不同。如果有很大的改进,我可能会将数据复制到 SSD 驱动器并从那里读取。
- data.table::fread 加快了文本文件的读取速度(虽然我不完全理解为什么)但它不能用于 excel 文件 - 或者可以吗?
- 我从这个answer 了解到
readxl往往比openxlsx快
我只对表格数据感兴趣;我对 Excel 格式不感兴趣,对图表、文本标签或任何其他类型的数据也不感兴趣。
我可能希望导入 tidyverse tibbles,但不一定。然后我需要将表导出到 Microsoft SQL Server。
一些背景知识:我主要使用 Python 并且对 R 完全陌生。在 Python 中读取大型 Excel 文件非常缓慢。我已经看到 R 的 readxl 比 Python 的 @987654325 快得多@(在 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()
【问题讨论】:
-
找不到合适的副本。你试过
fread吗?! -
我认为 fread 仅适用于文本文件,不适用于 xlsx。还是我弄错了?
-
我还注意到,在 R 中将相同的 58 MB 数据导出到 SQL 比在 Python 中快得多:4.25 秒 vs 18.4 秒
标签: r parallel-processing readxl