我想创建一个非常大的字典,我想将它存储在磁盘上,以免破坏我的记忆。基本上,我的需求是cPickle和dict类之间的交叉,因为它是一个Python类似于字典的类,但恰好存在于磁盘上。
我的第一个想法是围绕一个简单的MySQL表创建某种包装,但我必须将类型存储在MySQL甚至不希望开箱即用的结构条目中。
答案 0 :(得分:2)
最简单的方法是shelve模块,它的工作方式几乎与字典完全相同:
import shelve
myshelf = shelve.open("filename") # Might turn into filename.db
myshelf["A"] = "First letter of alphabet"
print myshelf["A"]
# ...
myshelf.close() # You should do this explicitly when you're finished
请注意module documentation中关于更改存储在架子上的可变值(列表,字符串等)的警告(您可以,但需要更多的摆弄)。它使用(c)引擎盖下的泡菜和dbm,因此它可以快乐地存储你可以腌制的任何东西。
我不知道它相对于其他解决方案的表现如何,但它不需要任何自定义代码或第三方库。
答案 1 :(得分:1)
请查看具体内容中的dbm,以及手册中的整个Data Persistence章节。大多数键/值存储数据库(gdbm,bdb,metakit等)都有类似dict的API,它可能满足您的需求(并且完全可嵌入,因此无需管理外部数据库进程)。
答案 2 :(得分:0)
文件IO在CPU周期方面很昂贵。所以我的第一个想法是支持数据库。
但是,您也可以在多个文件中拆分“英语词典”,以便(比方说)每个文件包含以字母表中特定字母开头的单词(因此,您将有26个文件)。
现在,当你说I want to create a very very large dictionary
时,你的意思是一个python dict
或一个带有单词及其定义的英语词典,存储在dict
中(带有单词作为键和定义值)?正如您所指出的,第二个可以使用cPickle轻松实现。
同样,如果内存是您主要关注的问题,那么您需要重新检查要使用的文件数量,因为如果您在每个文件中挑选dict
,那么您需要{ {1}}不要太大
也许一个可用的解决方案就是这样做(我假设所有英文单词都已排序):
这个解决方案很有用:
说你的问题是查找特定单词的定义。现在,在运行时,您可以读取每个文件中的第一个单词,并确定您要查找的单词是否在您读取的上一个文件中(您需要一个循环计数器来检查您是否在最后一个文件中) 。一旦确定了要查找的单词所在的文件,就可以打开该文件并将该文件的内容加载到dict
。
在不了解手头问题的更多细节的情况下提供解决方案有点困难。