gpt4 book ai didi

r - 寻求gz连接是不可预测的

转载 作者:行者123 更新时间:2023-12-03 12:19:16 25 4
gpt4 key购买 nike

我在R中寻找gzfile时遇到麻烦。这是一个示例:

set.seed(123)
m=data.frame(z=runif(10000),x=rnorm(10000))
write.csv(m,"m.csv")
system("gzip m.csv")
file.info("m.csv.gz")$size
[1] 195975

这样就创建了 m.csv.gz,R表示可以继续使用它,并且对 seek的帮助似乎也同意:
gzf=gzfile("m.csv.gz")
open(gzf,"rb")
isSeekable(gzf)
[1] TRUE

现在,来回小的跳动似乎可行,但是如果尝试大跳动,则会出现错误:
seek(gzf,10)
[1] 10
seek(gzf,20)
[1] 10
seek(gzf,10)
[1] 20
seek(gzf,1000)
[1] 100
Warning message:
In seek.connection(gzf, 1000) :
seek on a gzfile connection returned an internal error

但是,如果我重新设置连接并重新开始,则以100字节为步长可以达到1000:
for(i in seq(100,1000,by=100)){seek(gzf,i)}
seek(gzf,NA)
[1] 1000

R对于在Windows中使用 seek有一些苛刻的话:“不鼓励在Windows中使用'seek'。”但这是在Linux机器上(R 3.1.1,32位)。使用 gz库的python中类似的代码可以很好地工作,并遍历所有对象。

R 3.2.0稍微提供了更多信息:
Warning messages:
1: In seek.connection(gzf, 1000) : invalid or incomplete compressed data
2: In seek.connection(gzf, 1000) :
seek on a gzfile connection returned an internal error

有想法吗?我已经将其作为错误报告提交了。

最佳答案

这只是一个有根据的猜测:小跳转只是在解码缓冲区中处理的,当您查找超出缓冲区大小的内容时,它将执行原始查找,然后尝试在大块中间解码gzip,从而导致解码错误,这很可能是R库中的错误。我建议使用skip而不是seek,因为基础库无法执行任何操作,并且不会对性能产生任何影响。

我刚刚检查了rfc1952和rfc1951,在gzip中,您可以通过读取所有“members” header 并汇总所有ISIZE字段来知道文件的完整大小,但是如果不对它进行解码,您将无法知道它的大小。 (每个符号的大小在词典中),您根本无法真正寻求通用的gzip流。

如果您确实要查找gzip,则必须事先对其进行索引。

dictzip 是一个库,它添加了额外的 header 以允许查找。

关于r - 寻求gz连接是不可预测的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30834963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com