为何rhdf5 R包可读取本地HDF5文件却无法读取外接SSD中的文件?
rhdf5读取外接SSD中H5文件失败,本地文件正常的问题排查与解决
问题描述
使用R的sleuth包分析RNA-seq数据时,遇到rhdf5包的文件读取异常:调用H5Fopen()读取外接SSD中的abundance.h5文件时,报错HDF5. File accessibility. Unable to open file.,但读取本地磁盘(桌面)的同一份文件完全正常。两份文件内容完全一致,原文件存储在外接SSD,今日复制到本地。需求是保留文件在外接SSD中直接使用。
已尝试的无效方案
- 设置环境变量
Sys.setenv(HDF5_USE_FILE_LOCKING = "FALSE")和Sys.setenv(RHDF5_USE_FILE_LOCKING = "FALSE"),无效果 - 参考过sleuth相关社区问题及Stack Overflow的H5文件读取提问,未解决问题
相关代码与环境信息
> library("rhdf5") > H5Fopen("/pathway/to/external/SSD/abundance.h5") # 报错如下: Error in H5Fopen("/pathway/to/external/SSD/abundance.h5") : HDF5. File accessibility. Unable to open file. > H5Fopen("/Users/myname/Desktop/abundance.h5") # 此命令执行完全正常 > sessionInfo() R version 4.1.3 (2022-03-10) Platform: aarch64-apple-darwin20 (64-bit) Running under: macOS 13.0 Matrix products: default LAPACK: /Library/Frameworks/R.framework/Versions/4.1-arm64/Resources/lib/libRlapack.dylib locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] rhdf5_2.38.1 loaded via a namespace (and not attached): [1] KEGGREST_1.34.0 progress_1.2.2 tidyselect_1.2.0 [4] xfun_0.36 vctrs_0.5.1 generics_0.1.3 [7] htmltools_0.5.4 stats4_4.1.3 BiocFileCache_2.2.1 [10] yaml_2.3.6 utf8_1.2.2 blob_1.2.3 [13] XML_3.99-0.13 rlang_1.0.6 pillar_1.8.1 [16] glue_1.6.2 DBI_1.1.3 rappdirs_0.3.3 [19] BiocGenerics_0.40.0 bit64_4.0.5 dbplyr_2.2.1 [22] GenomeInfoDbData_1.2.7 lifecycle_1.0.3 stringr_1.5.0 [25] zlibbioc_1.40.0 Biostrings_2.62.0 memoise_2.0.1 [28] evaluate_0.19 Biobase_2.54.0 knitr_1.41 [31] IRanges_2.28.0 fastmap_1.1.0 biomaRt_2.50.3 [34] GenomeInfoDb_1.30.1 curl_4.3.3 fansi_1.0.3 [37] AnnotationDbi_1.56.2 Rcpp_1.0.9 filelock_1.0.2 [40] cachem_1.0.6 S4Vectors_0.32.4 XVector_0.34.0 [43] bit_4.0.5 hms_1.1.2 png_0.1-8 [46] digest_0.6.31 stringi_1.7.8 dplyr_1.0.10 [49] rhdf5filters_1.6.0 cli_3.5.0 tools_4.1.3 [52] bitops_1.0-7 magrittr_2.0.3 tibble_3.1.8 [55] RCurl_1.98-1.9 RSQLite_2.2.20 crayon_1.5.2 [58] pkgconfig_2.0.3 ellipsis_0.3.2 xml2_1.3.3 [61] prettyunits_1.1.1 assertthat_0.2.1 rmarkdown_2.19 [64] httr_1.4.4 rstudioapi_0.14 Rhdf5lib_1.16.0 [67] R6_2.5.1 compiler_4.1.3
解决方案建议
1. 检查外接SSD的权限与文件系统格式
- macOS对外接NTFS格式磁盘默认只读,即使显示可写也可能存在权限异常。建议将SSD格式化为APFS或Mac OS扩展(日志式),或安装NTFS读写工具确保权限正常。
- 手动赋予R/RStudio读取SSD的权限:打开「系统设置」→「隐私与安全性」→「文件与文件夹」,找到R或RStudio,勾选外接SSD的访问权限。
2. 使用完整的磁盘挂载路径
避免使用自定义短路径,直接使用/Volumes/[SSD名称]/开头的完整路径,例如:
H5Fopen("/Volumes/MyExternalSSD/abundance.h5")
3. 更新rhdf5及依赖库
当前使用的rhdf5版本为2.38.1,尝试更新到适配arm64架构的最新版本:
if (!require("BiocManager")) install.packages("BiocManager") BiocManager::install("rhdf5") BiocManager::install("Rhdf5lib")
4. 直接使用sleuth封装的接口
sleuth本身封装了H5文件读取逻辑,尝试直接用sleuth_prep()指定SSD中的文件路径,绕过手动调用H5Fopen的权限问题:
library(sleuth) # 替换为你的样本信息CSV路径,其中包含SSD中的abundance.h5路径 so <- sleuth_prep("/Volumes/MyExternalSSD/sample_info.csv")
5. 进阶:彻底禁用HDF5文件锁定
除了在R中设置环境变量,尝试在终端启动R前先设置变量:
export HDF5_USE_FILE_LOCKING=FALSE R
或者调用H5Fopen时指定只读模式并禁用锁定:
H5Fopen("/Volumes/MyExternalSSD/abundance.h5", flags = H5F_ACC_RDONLY)
内容的提问来源于stack exchange,提问作者bkleiboeker
相关产品推荐
相关产品推荐

