如何解压/解密gzip-fi的单行

2024-04-19 04:13:20 发布

您现在位置:Python中文网/ 问答频道 /正文

关键是这是一个巨大的文件。我的目标是避免一次将整个文件读入内存,并避免解析循环中的每一行以获取所需的行(因为这需要花费很长时间)。文件实际上有1500万行长)。在

我现在正在做的是打开文件。。。在

self._FH = gzip.open(filename, "rb")

…将指针直接移动到所需行的位置(使用了许多诡计,但它是有效的)并在单个行中读取。在

下面的行与下面类似(虽然这些示例来自文件的开头,但为了方便和信息起见)。。。在

^{pr2}$

有些人可能会注意到这是一个BAM文件,因此如果有更好的方法来实现这一点,欢迎提出建议……尽管samtools过滤器不能满足我的需要。我必须按行查找,而不是按数据查找。在


Tags: 文件内存self信息示例目标openfilename
2条回答

在一个文件中,你可以用一个1000行的索引来精确定位一个文件。indexed-gzip可能是一个选项。在

但是,查看这些数据让我想知道,您是否不能只手动进行压缩。如果压缩到固定长度,则可以计算文件中每行的起始位置,然后从该位置读取。似乎每一行只能用两个数字来表示。或者我不明白格式吗?在

一个简单的方法是利用这样一个事实,即有效gzip流的串联就是gzip流。然后,在压缩时,可以将行块压缩成单独的gzip流,并注意gzip流在文件中的起始位置,以及在该流中压缩的第一行的行号。然后你就可以跳转到那个位置,从那里开始解压。如果你的数据块大约是一兆字节(大约50000行),那么压缩比应该会有相对较小的降低。平均来说,你需要解压缩25000条线才能到达任何给定的行,而不是750万条线。在

如果不能控制gzip文件的创建,并且不能根据需要重新创建它,那么可以使用zran.c中使用的方法为现有gzip文件编制索引。您可以指定您希望访问点的距离,它将构建一个索引,允许从每个访问点开始访问。您还需要为行首建立一个索引(就像对未压缩的文件一样),以便将那些与字节偏移量关联到未压缩数据中。在

相关问题 更多 >