我想創建一個非常大的字典,並且我想將它存儲在磁盤上以免殺死我的內存。基本上,我的需求是cPickle和dict類之間的一個交叉點,因爲它是Python像字典一樣處理的類,但恰好存在於磁盤上。我需要一個創建磁盤上的字典文件的類
我的第一個想法是圍繞一個簡單的MySQL表創建某種包裝,但是我必須將類型存儲在MySQL甚至不希望開箱即用支持的結構條目中。
我想創建一個非常大的字典,並且我想將它存儲在磁盤上以免殺死我的內存。基本上,我的需求是cPickle和dict類之間的一個交叉點,因爲它是Python像字典一樣處理的類,但恰好存在於磁盤上。我需要一個創建磁盤上的字典文件的類
我的第一個想法是圍繞一個簡單的MySQL表創建某種包裝,但是我必須將類型存儲在MySQL甚至不希望開箱即用支持的結構條目中。
最簡單的方法是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,所以它會高興地存儲任何可以醃製的東西。
我不知道它相對於其他解決方案表現如何,但它不需要任何自定義代碼或第三方庫。
請特別注意dbm,一般在手冊的整個Data Persistence一章。大多數關鍵/值存儲數據庫(gdbm,bdb,metakit等)都有一個類似字典的API,它可能會滿足您的需求(並且完全可嵌入,因此不需要管理外部數據庫進程)。
文件IO在CPU週期方面很昂貴。所以我的第一個想法是贊成數據庫。 (也就是說)每個文件都包含以字母表中的特定字母開頭的單詞(因此,您將擁有26個文件)。但是,您也可以將多個文件分割爲多個文件。
現在,當你說I want to create a very very large dictionary
,你的意思是蟒蛇dict
或英文字典,單詞及其定義,存儲在dict
(文字作爲鍵和定義的值)?正如你指出的那樣,第二個可以用cPickle輕鬆實現。同樣,如果內存是您主要關心的問題,那麼您需要重新檢查要使用的文件數量,因爲如果您在每個文件中使用dict
s,那麼您希望dict
s不適用於受到太大
或許可用的解決方案,你會做到這一點(我會認爲所有的英語單詞進行排序):
這是該解決方案是如何有用:
說,你的問題是查找一個特定的詞的定義。現在,在運行時,您可以讀取每個文件中的第一個單詞,並確定您要查找的單詞是否在您讀取的上一個文件中(您將需要一個循環計數器來檢查您是否位於最後一個文件中) 。一旦你確定了你正在查找的單詞是哪個文件,那麼你可以打開該文件並將該文件的內容加載到dict
中。
在不瞭解手頭問題的更多細節的情況下提供解決方案有點困難。
我的意思是一個python字典。 – Alex 2010-11-20 22:09:36
「大」有多大?你會主要從字典中閱讀還是寫作?此外,可能有將數據存儲在MySQL表中的方法,但是如果沒有關於數據的更多詳細信息,很難進行討論。數據是純數字的嗎?如果不是,什麼? – unutbu 2010-11-20 17:27:29
儘管文件不會快速增長,但它的大小沒有界限,所以我想找到一個解決方案,使我能夠儘可能高效地存儲隨時間推移而隨意增大的文件。 – Alex 2010-11-20 22:12:32