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
相关产品推荐
相关产品推荐

