关键是这是一个巨大的文件。我的目标是避免立即将整个文件读入内存,并避免解析循环中的每一行以到达我需要的行(因为这需要花费很长时间。该文件实际上有1500万行长)。
我现在要做的是把文件.
self._FH = gzip.open(filename, "rb")...moving指针直接指向所需行的位置(使用许多恶作剧,但它有效)并在单独的行中读取。
与下面类似的行(尽管这些示例来自文件的开头,为了方便和信息起见).
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过滤器不会完成我所需要的。我必须通过线来寻找,而不是通过数据。
发布于 2017-11-10 21:00:31
一种简单的方法是利用以下事实:将有效的gzip流连接起来就是gzip流。然后,在压缩时,您可以将大块行压缩为单个gzip流,并注意到gzip流在文件中的起始位置,以及在该流中压缩的第一行的行号。然后你就可以跳到那个位置然后开始解压。如果你的数据块是兆字节(大约50,000行),那么压缩比应该是相对较小的。平均来说,你需要解压25000条线路才能到达任何给定的线路,而不是750万条线路。
如果您无法控制gzip文件的创建,并且无法根据您的需要重新创建它,那么您可以使用zran.c中使用的方法索引现有的gzip文件。您可以指定希望访问点有多近,并且它将生成允许从每个访问点开始访问的索引。您还需要为行启动(就像对未压缩文件一样)构建一个索引,以便将那些与字节偏移关联到未压缩数据中。
发布于 2017-11-10 19:17:37
您将无法在gzip文件中为随机访问找到一个专门的行,但是您可以使用压缩文件中的一个索引,然后用1000行或其他东西定位一个块。索引-gzip可能是一种选择。
然而,查看这些数据让我想知道您是否不能手工进行压缩。如果将压缩压缩为固定长度,则可以计算文件中每一行的起始位置,然后从该位置读取。似乎每一行都可以用两个数字来表示。还是我不明白格式?
https://stackoverflow.com/questions/47228508
复制相似问题