小编eas*_*sid的帖子

使用python pickle加载大字典

我有一个嵌套python字典形式的完整倒排索引.其结构是:

{word : { doc_name : [location_list] } }
Run Code Online (Sandbox Code Playgroud)

例如,让字典称为索引,然后对于单词"spam",条目看起来像:

{ spam : { doc1.txt : [102,300,399], doc5.txt : [200,587] } }
Run Code Online (Sandbox Code Playgroud)

我使用这个结构,因为python dict非常优化,它使编程更容易.

对于任何"垃圾邮件"这个词,包含它的文件可以通过以下方式给出:

index['spam'].keys()
Run Code Online (Sandbox Code Playgroud)

并通过以下方式发布文档doc1的列表:

index['spam']['doc1']
Run Code Online (Sandbox Code Playgroud)

目前我正在使用cPickle来存储和加载这本字典.但是pickle文件大约是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'
Run Code Online (Sandbox Code Playgroud)

如何让它加载更快?我只需要在应用程序启动时加载一次.之后,访问时间对于响应查询很重要.

我应该切换到像SQLite这样的数据库并在其键上创建索引吗?如果是,我如何存储值以具有等效模式,这使得检索变得容易.还有什么我应该研究的吗?

附录

使用添的回答pickle.dump(index, file, -1)腌制文件相当小-围绕237 MB(花了300秒时间来转储)......并采取一半立即加载(61秒的时间......而不是112分更早的.... 了time.time ())

但是我应该迁移到数据库以获得可伸缩性吗? …

python pickle inverted-index

10
推荐指数
2
解决办法
2万
查看次数

存储倒排索引

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

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

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

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

python information-retrieval inverted-index

5
推荐指数
1
解决办法
3489
查看次数

如何在python中获取文件中的字节偏移量

我使用hadoop和python制作倒排索引.我想知道如何在python中包含行/字的字节偏移量.我需要这样的东西

hello hello.txt@1124
Run Code Online (Sandbox Code Playgroud)

我需要制作完整倒排索引的位置.请帮忙.

python inverted-index

1
推荐指数
1
解决办法
9441
查看次数