我正在开发一个关于Info Retrieval的项目。 我使用Hadoop / Python制作了完全倒置索引。 Hadoop将索引输出为(word,documentlist)对,这些对写在文件上。 为了快速访问,我使用上面的文件创建了一个字典(哈希表)。 我的问题是,如何在磁盘上存储这样一个也具有快速访问时间的索引。 目前我正在使用python pickle模块存储字典并从中加载 但它会立刻将整个索引带入内存(或者它是什么?)。 请建议一种有效的方法来存储和搜索索引。
我的词典结构如下(使用嵌套词典)
{word:{doc1:[locations],doc2:[locations],....}}
这样我就可以获得包含单词的文档了 字典[word] .keys()......等等。
答案 0 :(得分:4)
目前我正在使用python pickle模块存储字典并从中加载,但它会立即将整个索引存入内存(或者是吗?)。
是的它确实带来了全部。
这是一个问题吗?如果这不是一个实际问题,那么坚持下去。
如果这是一个问题,你有什么问题?太慢了?太快?太多彩了?使用的内存太多了?你有什么问题?
答案 1 :(得分:1)
我会使用Lucene。为什么重新发明轮子?
答案 2 :(得分:0)
只需将其存储在如下字符串中:
<entry1>,<entry2>,<entry3>,...,<entryN>
如果<entry*>
包含','字符,请使用其他分隔符,例如'\ t'。
它的尺寸小于等效的酸洗绳。
如果您想加载它,只需执行:
L = s.split(delimiter)
答案 3 :(得分:0)
您可以存储字典的repr()并使用它来重新创建它。
答案 4 :(得分:0)
如果加载或使用太多内存需要很长时间,则可能需要一个数据库。你可能会使用很多;我可能会从SQLite开始。然后你的问题被“减少”;-)简单地制定正确的查询以从数据库中获得你需要的东西。这样你就只能加载你需要的东西。
答案 5 :(得分:0)
我正在使用anydmb用于此目的。 Anydbm提供了相同的类字典接口,除了它只允许字符串作为键和值。但这不是约束,因为您可以使用cPickle的加载/转储在索引中存储更复杂的结构。