我需要一个类来创建一个存在于磁盘上的字典文件

时间:2010-11-20 17:09:28

标签: python

我想创建一个非常大的字典,我想将它存储在磁盘上,以免破坏我的记忆。基本上,我的需求是cPickle和dict类之间的交叉,因为它是一个Python类似于字典的类,但恰好存在于磁盘上。

我的第一个想法是围绕一个简单的MySQL表创建某种包装,但我必须将类型存储在MySQL甚至不希望开箱即用的结构条目中。

3 个答案:

答案 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}}不要太大

也许一个可用的解决方案就是这样做(我假设所有英文单词都已排序):

  1. 将英语中的所有单词合并为一个文件。
  2. 计算有多少这样的单词,并根据文件的大小将它们分成任意数量的文件。
  3. 现在,这些较小的文件包含单词及其含义
  4. 这个解决方案很有用:

    说你的问题是查找特定单词的定义。现在,在运行时,您可以读取每个文件中的第一个单词,并确定您要查找的单词是否在您读取的上一个文件中(您需要一个循环计数器来检查您是否在最后一个文件中) 。一旦确定了要查找的单词所在的文件,就可以打开该文件并将该文件的内容加载到dict

    在不了解手头问题的更多细节的情况下提供解决方案有点困难。