【发布时间】:2011-04-26 20:16:49
【问题描述】:
我有一个嵌套 python 字典形式的完整倒排索引。它的结构是:
{word : { doc_name : [location_list] } }
例如让字典被称为索引,那么对于一个单词“垃圾邮件”,条目看起来像:
{ spam : { doc1.txt : [102,300,399], doc5.txt : [200,587] } }
我使用这种结构是因为 python dict 已经非常优化,它使编程更容易。
对于任何单词“垃圾邮件”,包含它的文档可以通过:
index['spam'].keys()
以及文档 doc1 的发布列表:
index['spam']['doc1']
目前我正在使用 cPickle 来存储和加载这个字典。但是腌制文件大约 380 MB 并且需要很长时间才能加载 - 112 秒(大约。我使用 time.time() 对其进行计时)并且内存使用量达到 1.2 GB(Gnome 系统监视器) .一旦它加载,它的罚款。我有 4GB 内存。
len(index.keys()) 给出 229758
代码
import cPickle as pickle
f = open('full_index','rb')
print 'Loading index... please wait...'
index = pickle.load(f) # This takes ages
print 'Index loaded. You may now proceed to search'
我怎样才能让它加载得更快?我只需要在应用程序启动时加载一次。之后,访问时间对于响应查询很重要。
我应该切换到像 SQLite 这样的数据库并在其键上创建索引吗?如果是,我如何存储值以具有等效的模式,这使得检索变得容易。还有什么我应该研究的吗?
附录
使用 Tim 的回答 pickle.dump(index, file, -1),腌制文件要小得多 - 大约 237 MB(转储需要 300 秒)......现在加载时间减少了一半(61 秒......而不是之前的 112 秒。 ... time.time())
但是我应该迁移到数据库以获得可扩展性吗?
至于现在,我将 Tim 的回答标记为已接受。
PS:我不想使用 Lucene 或 Xapian ... 这个问题指的是Storing an inverted index。我不得不提出一个新问题,因为我无法删除前一个问题。
【问题讨论】:
-
@S.Lott : 添加时间细节
-
“但是我应该迁移到数据库以获得可扩展性吗?”只有您可以决定加载时间是否有问题。你多久加载一次?与加载所需的时间相比,您运行了多少查询?这是一个需要事实的工程问题。
-
@S.Lott:我想试试数据库实现。这将是一个很好的比较。我还有很多时间来完成它。我现在遇到的问题是将索引存储在数据库中。我认为字典实现是一个好主意,但这在数据库中是不可能的。我阅读了这些关于数据库存储的帖子stackoverflow.com/questions/1571140/…、stackoverflow.com/questions/3581792/…,但它们并没有太大帮助。
-
“字典实现是个好主意,但在数据库中这是不可能的”。错误的。获得更好的 ORM。
标签: python pickle inverted-index