【问题标题】:On Disk Substring index磁盘子串索引
【发布时间】:2010-09-08 08:46:25
【问题描述】:

我有一个想要索引的文件(具体是fasta文件),这样我可以快速找到文件中的任何子字符串,然后在原始fasta文件中找到位置。

这在许多情况下很容易做到,使用 Trie 或子字符串数组,不幸的是我需要索引的字符串是 800+ MB,这意味着在内存中执行它们是不可接受的,所以我正在寻找一种合理的方法以最少的内存使用在磁盘上创建此索引。

(编辑澄清)

我只对蛋白质的标题感兴趣,所以对于我感兴趣的最大数据库来说,这大约是 800 MB 的文本。

我希望能够根据输入字符串在 O(N) 时间内找到准确的子字符串。这必须可以在 32 位机器上使用,因为它将被随机发送给不会拥有 64 位机器的人。

我希望能够针对一行中的任何断字进行索引,直到行尾(尽管行可能有几 MB 长)。

希望这可以阐明需要什么以及为什么给出的当前解决方案没有启发性。

我还应该补充一点,这需要在 java 中完成,并且必须在各种操作系统的客户端计算机上完成,所以我不能使用任何特定于操作系统的解决方案,它必须是程序化解决方案。

【问题讨论】:

  • 您可能需要详细说明一下。什么是快?您要查找的子字符串(大小)是否有任何限制?文件是否包含需要单独搜索的一个大字符串或几个较小的字符串?磁盘大小? “最少”内存使用?
  • 操作系统?您需要在搜索字符串中进行正则表达式还是要查找整个字符串匹配项?

标签: indexing substring on-disk


【解决方案1】:

我不认为原始发布者还有这个问题,但是任何需要 FASTA 文件索引和子序列提取的人应该查看 fastahack:http://github.com/ekg/fastahack

它使用索引文件来计算换行符和序列起始偏移量。生成索引后,您可以快速提取子序列;提取由 fseek64 驱动。

如果您的序列与海报的序列一样长,它将非常非常有效。但是,如果您的 FASTA 文件中有数千或数百万个序列(如短读测序或某些 de novo 程序集的输出的情况),您将需要使用另一种解决方案,例如作为磁盘支持的键值存储。

【讨论】:

    【解决方案2】:

    FASTA file format 非常稀疏。我要做的第一件事是生成一个紧凑的二进制格式,并索引 that - 它应该是当前文件大小的 20-30%,并且编码/解码数据的过程应该是速度足够快(即使是 4GB)也不会成为问题。

    此时,您的文件应该适合内存,即使在 32 位机器上也是如此。让操作系统对其进行分页,或者如果您想确定它全部在内存中,请制作一个 ramdisk。

    请记住,内存仅为每 GB 30 美元左右(而且越来越便宜),因此如果您有 64 位操作系统,那么您甚至可以处理内存中的完整文件,而无需将其编码为更紧凑的格式。

    祝你好运!

    -亚当

    【讨论】:

      【解决方案3】:

      在某些语言中,程序员可以访问“直接字节数组”memory maps,由操作系统提供。在 java 中,我们有 java.nio.MappedByteBuffer。这允许人们像处理内存中的字节数组一样处理数据,而实际上它在磁盘上。可以使用的文件大小仅受操作系统的虚拟内存能力限制,对于 32 位计算机,通常为 ~

      这会让您轻松处理一个大文件。

      【讨论】:

      • 所以,这个想法的问题在于,对于一​​个 7 MB 的头文件,子字符串 Trie 大约是 600 MB。
      • 我的帖子的重点是,当使用直接字节缓冲区时,人们可以从字面上忘记磁盘上的内容和内存中的内容之间的区别,而只专注于算法。
      • 除非您在处理超过 4 gigs 的数据时不能这样做。
      • 您的 OP 说 800MB,而不是 4GB。 :S 是否可以选择升级到 64 位操作系统?
      • 我已经用现代 64 位通用 CPU 可寻址内存信息更新了答案。
      【解决方案4】:

      我与几位同事交谈过,他们只是在需要时使用 VIM/Grep 进行搜索。大多数时候,我不希望有人搜索这样的子字符串。

      但我不明白为什么 MS Desktop 搜索或 Spotlight 或 google 的等价物在这里无法为您提供帮助。

      我的建议是按基因或物种拆分文件,希望输入序列不会交错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 2011-02-14
        • 2017-11-20
        • 1970-01-01
        • 2015-01-05
        相关资源
        最近更新 更多