代码之家  ›  专栏  ›  技术社区  ›  easysid

存储倒排索引

  •  4
  • easysid  · 技术社区  · 14 年前

    我使用Hadoop/Python制作了一个完整的倒排索引。 Hadoop将索引输出为(word,documentlist)对,并将其写入文件中。 为了快速访问,我使用上述文件创建了一个字典(哈希表)。 我的问题是,如何将这样一个索引存储在具有快速访问时间的磁盘上。 但它会立即将整个索引带到内存中(或者是这样吗?)。 请建议一种有效的存储和搜索索引的方法。

    我的字典结构如下(使用嵌套字典)

    {单词:{doc1:[位置],doc2:[位置],…..}}

    这样我就可以通过 字典[word].keys()。。。等等。

    6 回复  |  直到 14 年前
        1
  •  5
  •   S.Lott    14 年前

    shelve

    目前,我正在使用python pickle模块存储字典并从中加载,但它会立即将整个索引带到内存中(或者会吗?)。

    是的,它确实带来了一切。

    有问题吗?如果这不是一个实际的问题,那就坚持下去。

    如果是问题,你有什么问题?太慢了?太快了?太鲜艳了?内存使用过多?你有什么问题?

        2
  •  1
  •   Jay Askren    14 年前

    我会用 Lucene . 为什么要重新发明轮子?

        3
  •  0
  •   OTZ    14 年前

    只需将其存储在如下字符串中:

    <entry1>,<entry2>,<entry3>,...,<entryN>
    

    如果 <entry*> 这比同等的腌线小。

    如果要加载,只需执行以下操作:

    L = s.split(delimiter)
    
        4
  •  0
  •   supakeen    14 年前

    您可以存储字典的repr()并使用它重新创建它。

        5
  •  0
  •   kindall    14 年前

    如果需要很长时间加载或使用太多内存,则可能需要一个数据库。你可能会用到很多;我可能会从 SQLite . 那么您的问题就“简化”;—)为简单地制定正确的查询,以便从数据库中获得所需的内容。这样你只需要装你需要的东西。

        6
  •  0
  •   msaveski    14 年前

    我使用任何DMB的目的。Anydbm提供了与dictionary相同的接口,只是它只允许字符串作为键和值。但这不是一个约束,因为您可以使用cPickle的loads/dumps在索引中存储更复杂的结构。