【问题标题】:Find the file offset for a character index, ignoring newline查找字符索引的文件偏移量,忽略换行符
【发布时间】:2015-12-08 17:08:09
【问题描述】:

我有一个 3GB 大小的文本文件(一个包含 DNA 序列的 FASTA 文件)。它包含大约 5000 万行不同的 长度,尽管大多数行是 70 个字符宽。我想从这个文件中提取一个字符串,给定两个字符索引。困难的 部分是,换行符不应被视为字符。

为了获得良好的速度,我想使用seek() 到达字符串的开头并开始读取,但我需要以字节为单位的偏移量。

我目前的方法是编写一个新文件,删除所有换行符,但这需要另外 3GB 磁盘空间。我想找到一个需要更少磁盘空间的解决方案。

使用字典将每个字符计数映射到文件偏移量也不可行,因为每个字节都有一个键,因此至少使用 16 字节*30 亿个字符 = 48GB。

我想我需要一个数据结构,它允许检索某个索引字符之前的换行符的数量,然后我可以将它们的数量和字符索引相加以获得以字节为单位的文件偏移量。

【问题讨论】:

  • “给定两个字符索引”是什么意思。你的意思是你想从begin..end 获取子序列?
  • 你不能只存储每行的长度,然后使用该信息来计算字节偏移量吗?
  • @dkatzel 正是这样。
  • @heathobrien 是的,这是一种方式。我的问题集中在如何最有效地做到这一点。例如,对于每个字符索引,我可以遍历所有存储的字符索引,直到第一个大于我正在寻找的那个。我的问题可能针对一些数据结构,这是存储这些信息的好方法,并且可能比简单的字典更有效

标签: text indexing data-structures bioinformatics


【解决方案1】:

SamTools fai 索引就是为此目的而设计的。这使得一个非常小的紧凑索引文件具有足够的信息,只要文件格式正确,就可以快速查找 fasta 文件中的任何点以获取其中的任何记录

您可以使用samtools faidx 命令创建 SamTools 索引。

然后您可以使用 SamTools 包中的其他程序使用索引非常快速地提取子序列或对齐。

请参阅http://www.htslib.org/doc/samtools.html 了解用法。

【讨论】:

  • 我不知道samtools支持提取子序列!根据biostars.org/p/10469,像samtools faidx reference.fasta lyrata:1-108 这样的命令是可能的。
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 2013-07-14
  • 2016-02-11
  • 1970-01-01
  • 2019-12-04
  • 2018-10-03
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多