这里的关键是这是一个巨大的文件。我的目标是避免一次将整个文件读入内存,并避免解析循环中的每一行以到达我需要的行(因为它需要很长时间。该文件实际上有 1500 万行长)。
我目前正在做的是将文件打开为...
self._FH = gzip.open(filename, "rb")
...将指针直接移动到所需行的位置(使用许多恶作剧,但它有效)并在单独的行中读取。
类似于下面的行(尽管这些示例来自文件的开头,为了方便和信息起见)......
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
文件,所以如果有更好的方法可以做到这一点,欢迎提出建议……尽管samtools
过滤器无法满足我的需要。我必须按行搜索,而不是按数据搜索。