You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言unz()函数读取偏移超2^31字节的Zip文件失败求助

R语言unz()读取大型Zip文件末尾文件失败的问题

我从NCBI获取的基因组注释Zip归档(主要包含gff文件),为节省磁盘空间,尝试用R的unz()函数直接读取归档内文件,无需解压,但遇到异常:

ncbi.zip <- "file_location/name.zip"
files <- unzip(ncbi.zip, list=TRUE)
gff.files <- files$Name[ grep("gff$", files$Name) ]

# 读取第128个gff文件正常
gff.128 <- readLines( unz(ncbi.zip, gff.files[128]) )

# 读取第129个gff文件返回空结构(用read.table()会报错提示无内容)
gff.129 <- readLines( unz(ncbi.zip, gff.files[129]) )

# 第129个及之后的31个gff文件均无法读取内容

基础验证

该Zip文件本身无异常:用命令行unzip工具可正常解压目标文件,unzip -t校验也未报错。我在R 3.5(openSuse Leap 15.1)、3.6、4.2(centOS 7)多个版本、不同系统测试多个Zip文件,结果一致。

strace追踪分析

追踪读取第128和129个文件的系统调用过程:两者初始都会多次lseek至文件末尾(偏移量2845892608,大于2^31,推测是Zip目录位置)。

  • 读取第128个文件时,最终会lseek至略低于231的偏移量,后续可正常进行`lseek`和读取(偏移量可超过231)。
  • 读取第129个文件时,出现异常调用:
lseek(3, 2845933568, SEEK_SET)          = 2845933568
lseek(3, 4294963200, SEEK_SET)          = 4294963200
read(3, "", 4096)                       = 0
lseek(3, 4095, SEEK_CUR)                = 4294967295
read(3, "", 4096)                       = 0

文件实际仅约2.8GB,而4294967295即2^32 -1,疑似存在32位整数溢出bug,打算提交bug报告,想确认是否有类似案例,或是否是我操作失误导致。

内容的提问来源于stack exchange,提问作者lmjakt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:33:25