代码之家  ›  专栏  ›  技术社区  ›  Jesse Jashinsky

提高大文件的加载速度

  •  1
  • Jesse Jashinsky  · 技术社区  · 14 年前

    我的程序使用两个大文本文件(数百万行)。这些文件被解析并加载到哈希表中,以便可以快速访问数据。我面临的问题是,目前,解析和加载是程序中最慢的部分。下面是执行此操作的代码。

    database = extractDatabase(@type).chomp("fasta") + "yml"
    revDatabase = extractDatabase(@type + "-r").chomp("fasta.reverse") + "yml"
    @proteins = Hash.new
    @decoyProteins = Hash.new
    
    File.open(database, "r").each_line do |line|
      parts = line.split(": ")
      @proteins[parts[0]] = parts[1]
    end
    
    File.open(revDatabase, "r").each_line do |line|
      parts = line.split(": ")
      @decoyProteins[parts[0]] = parts[1]
    end
    

    文件如下所示。它一开始是一个YAML文件,但是修改了格式以提高解析速度。

    MTMDK: P31946   Q14624  Q14624-2    B5BU24  B7ZKJ8  B7Z545  Q4VY19  B2RMS9  B7Z544  Q4VY20
    MTMDKSELVQK: P31946 B5BU24  Q4VY19  Q4VY20
    ....
    

    我对设置文件和解析文件的不同方法进行了尝试,到目前为止,这是最快的方法,但仍然非常慢。

    有没有办法提高这个速度,或者我可以采取其他的方法?

    不起作用的事情列表 :

    • 亚马尔。
    • 分叉进程,然后通过管道检索哈希。
    4 回复  |  直到 14 年前
        1
  •  2
  •   Digikata    14 年前

    在我的用法中,在解析之前将文件全部或部分读入内存通常会更快。如果数据库的大小足够小,这可以简单到

    buffer = File.readlines(database)
    buffer.each do |line|
        ...
    end
    

    如果它们太大而无法放入内存,则会变得更复杂,必须先设置数据块读取,然后进行解析,或者使用单独的读取线程和解析线程进行线程化。

        2
  •  2
  •   Marc-André Lafortune    14 年前

        3
  •  1
  •   user166390 user166390    14 年前

    )不同,尽管我首先建议 (Ruby) BDB

    如果是固定大小的记录 然后可以通过代理对象对每个项执行延迟加载。这将是一个mmap合适的候选人。然而,这将 加快总访问时间,但只会在程序的整个生命周期中分摊加载(至少在第一次使用之前,如果一些数据从未使用过,那么您就可以获得从不加载它的好处)。如果没有固定大小的记录或确定的索引值,这个问题会更复杂,并且看起来更像传统的“索引”存储(例如,SQL后端中的B树或BDB使用的任何东西:-)。

    这里线程的一般问题是:

    1. IO将 可能的
    2. 在使用前你仍然需要所有的数据

    你可能对 Widefinder Project ,通常只是“尝试更快的IO处理”。

        4
  •  0
  •   Michael Bazos    14 年前