相关疑难解决方法(0)

使用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万
查看次数

标签 统计

inverted-index ×1

pickle ×1

python ×1