我有一个
python脚本,使用大型(~14gb)文本文件.我最终得到了一个键和值的字典,但是当我尝试按值对字典进行排序时,我收到内存错误.
我知道字典太大了,无法加载到内存然后排序,但我怎么能完成这个呢?
最佳答案 您可以使用有线键/值存储,如wiredtiger,leveldb,bsddb.所有这些都支持使用自定义排序功能的有序键. leveldb是最容易使用的,但如果你使用python 2.7,
bsddb
is included in the stdlib.如果你只需要字典排序,你可以使用raw hashopen函数打开一个持久排序的字典:
from bsddb import hashopen
db = hashopen('dict.db')
db['020'] = 'twenty'
db['002'] = 'two'
db['value'] = 'value'
db['key'] = 'key'
print(db.keys())
这输出
>>> ['002', '020', 'key', 'value']
工作结束后别忘了关闭数据库:
db.close()
请注意,hashopen配置可能不适合您的需要.在这种情况下,我建议你使用leveldb,它有一个简单的API或wiretiger来提高速度.
要按bsddb中的值排序,您必须使用复合键模式或键组合.归结为创建一个字典键,保持您寻找的顺序.在此示例中,我们首先打包原始dict值(以便首先显示小值)和原始dict键(以便bsddb键是唯一的):
import struct
from bsddb import hashopen
my_dict = {'a': 500, 'abc': 100, 'foobar': 1}
# insert
db = hashopen('dict.db')
for key, value in my_dict.iteritems():
composite_key = struct.pack('>Q', value) + key
db[composite_key] = '' # value is not useful in this case but required
db.close()
# read
db = hashopen('dict.db')
for key, _ in db.iteritems(): # iterate over database
size = struct.calcsize('>Q')
# unpack
value, key = key[:size], key[size:]
value = struct.unpack('>Q', value)[0]
print key, value
db.close()
这输出如下:
foobar 1
abc 100
a 500