我有一个使用大型(〜14GB)文本文件的python脚本。我最终得到了一个键和值的字典,但是当我尝试按值排序字典时,出现内存错误。如何对大型字典进行排序
我知道字典太大,无法载入内存然后排序,但我怎么能去完成这个?
我有一个使用大型(〜14GB)文本文件的python脚本。我最终得到了一个键和值的字典,但是当我尝试按值排序字典时,出现内存错误。如何对大型字典进行排序
我知道字典太大,无法载入内存然后排序,但我怎么能去完成这个?
您可以使用像wiredtiger,leveldb,bsddb这样的有序键/值存储。它们都支持使用自定义排序功能的有序键。 leveldb是最容易使用的,但如果你使用python 2.7,bsddb
is included in the stdlib。如果你只需要字典排序,你可以使用原始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或有线速度。
为了通过值bsddb订购,则必须使用复合键图案或键组合物。归结起来就是创建一个字典密钥,它可以保持您寻找的顺序。在这个例子中,我们首先包的原始字典值(使得小的值首先出现)与原来的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
很感谢所有的信息。我决定去sqlite的路线,因为我可以在python中编写常规的sql,这对我来说很容易立即识别如何去做。我相信这些解决方案非常棒。感谢您指点我正确的方向 – deltaskelta
你正在使用哪个版本的python? – amirouche
我不知道这将证明多么有用,但检查此链接:http://stackoverflow.com/questions/14262433/large-data-work-flows-using-pandas ..你可以用你的目的熊猫? – akash12300
@amirouche python 2.7 – deltaskelta