首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解压缩/解密gzip文件的一行

如何解压缩/解密gzip文件的一行
EN

Stack Overflow用户
提问于 2017-11-10 17:51:05
回答 2查看 868关注 0票数 1

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

我现在要做的是把文件.

代码语言:javascript
复制
self._FH = gzip.open(filename, "rb")

...moving指针直接指向所需行的位置(使用许多恶作剧,但它有效)并在单独的行中读取。

与下面类似的行(尽管这些示例来自文件的开头,为了方便和信息起见).

代码语言:javascript
复制
b'BAM\x01\x17\x18\x00\x00@HD\tVN:1.0\tSO:coordinate\n'
b'@SQ\tSN:1\tLN:248956422\n'
b'@SQ\tSN:10\tLN:133797422\n'
b'@SQ\tSN:11\tLN:135086622\n'
b'@SQ\tSN:12\tLN:133275309\n'
b'@SQ\tSN:13\tLN:114364328\n'
b'@SQ\tSN:14\tLN:107043718\n'
b'@SQ\tSN:15\tLN:101991189\n'
b'@SQ\tSN:16\tLN:90338345\n' 
b'@SQ\tSN:17\tLN:83257441\n'
b'@SQ\tSN:18\tLN:80373285\n'

有些人可能会注意到这是一个BAM文件,所以如果有更好的方法来实现这一点,建议欢迎...although -- samtools过滤器不会完成我所需要的。我必须通过线来寻找,而不是通过数据。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-10 21:00:31

一种简单的方法是利用以下事实:将有效的gzip流连接起来就是gzip流。然后,在压缩时,您可以将大块行压缩为单个gzip流,并注意到gzip流在文件中的起始位置,以及在该流中压缩的第一行的行号。然后你就可以跳到那个位置然后开始解压。如果你的数据块是兆字节(大约50,000行),那么压缩比应该是相对较小的。平均来说,你需要解压25000条线路才能到达任何给定的线路,而不是750万条线路。

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

票数 4
EN

Stack Overflow用户

发布于 2017-11-10 19:17:37

您将无法在gzip文件中为随机访问找到一个专门的行,但是您可以使用压缩文件中的一个索引,然后用1000行或其他东西定位一个块。索引-gzip可能是一种选择。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47228508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档