如何加速将含12个工作表的XLSX文件读取到R中?
优化建议
1. 换用openxlsx2包读取,大幅降低解析开销
readxl依赖C语言的libxls库,对Excel格式的兼容性处理开销大;而openxlsx2是纯R实现的XLSX读写工具,针对规整表格的读取速度远快于readxl。
示例代码:
library(openxlsx2) # 一次性读取所有工作表,返回命名列表 my_data <- read_xlsx("foo.xlsx", sheets = NULL, col_names = FALSE)
2. 精准指定数据读取范围,跳过无关行
你的工作表中只有14行是有效数据(7组x/y行),其余是表头和空行。直接指定读取范围,避免工具解析无关内容:
示例(readxl兼容版):
library(readxl) my_sheets <- excel_sheets("foo.xlsx") my_data <- vector("list", length(my_sheets)) # 根据实际格式调整范围,比如有效数据在第3-26行 for(i in seq_along(my_sheets)){ my_data[[i]] <- read_excel( path = "foo.xlsx", sheet = my_sheets[i], col_names = FALSE, range = cell_rows(3:26) ) }
3. 预定义列类型,避免类型猜测
Excel读取工具默认会逐列猜测数据类型,这会增加大量解析时间。提前指定所有列的类型(比如全部为数值型):
示例:
col_types <- rep("numeric", 202) # 202列均为数值型 my_data <- lapply(my_sheets, function(sheet){ read_excel( "foo.xlsx", sheet = sheet, col_names = FALSE, col_types = col_types ) })
4. 放弃并行读取,改用单线程
你的测试显示并行读取未提速甚至变慢,核心原因是单个工作表数据量极小,并行进程的启动、文件IO竞争的开销远大于并行带来的收益。对于这种小文件,单线程读取效率更高。
5. 长期方案:仪器直接导出CSV格式
如果仪器支持导出CSV,直接导出为单个样本对应一个CSV文件,用vroom读取速度会提升数倍:
library(vroom) csv_files <- list.files("your_data_dir", pattern = "\\.csv$", full.names = TRUE) # 读取所有CSV并保留列表格式 my_data <- lapply(csv_files, vroom, col_names = FALSE)
内容的提问来源于stack exchange,提问作者Wissenschaftler
相关产品推荐
相关产品推荐

