5

我正在做一个关于信息检索的项目。我使用 Hadoop/Python 制作了一个完整的倒排索引。Hadoop 将索引输出为 (word,documentlist) 对,这些对被写入文件中。为了快速访问,我使用上述文件创建了一个字典(哈希表)。我的问题是,我如何在磁盘上存储这样一个索引,它也具有快速访问时间。目前我正在使用 python pickle 模块存储字典并从中加载,但它会将整个索引一次带入内存(或者是吗?)。请提出一种有效的存储和搜索索引的方法。

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

{word : {doc1:[locations], doc2:[locations], ....}}

这样我就可以通过 dictionary[word].keys() ... 等获取包含单词的文档。

4

6 回答 6

5

搁置

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

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

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

如果这是一个问题,你有什么样的问题?太慢了?太快?色彩太鲜艳?使用的内存过多?你有什么问题?

于 2010-09-10T19:45:12.573 回答
1

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

于 2010-09-14T03:24:54.057 回答
0

只需将其存储在这样的字符串中:

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

如果<entry*>包含 ',' 字符,请使用其他分隔符,例如 '\t'。这比同等的腌制字符串要小。

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

L = s.split(delimiter)
于 2010-09-10T21:01:47.767 回答
0

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

于 2010-09-10T21:40:56.880 回答
0

如果加载需要很长时间或使用太多内存,您可能需要一个数据库。您可能会使用很多;我可能会从SQLite开始。然后你的问题被“减少”;-) 简单地制定正确的查询来从数据库中获取你需要的东西。这样,您将只加载您需要的内容。

于 2010-09-10T22:36:36.707 回答
0

我为此目的使用anydmb。Anydbm 提供了相同的类字典接口,除了它只允许字符串作为键和值。但这不是一个约束,因为您可以使用 cPickle 的加载/转储在索引中存储更复杂的结构。

于 2011-03-17T15:36:00.373 回答