2008-10-01 56 views
4

我正在爲python編寫的boggle-clone創建一個網絡服務器,它接受用戶,解決棋盤問題並對玩家輸入進行評分。我使用的字典文件是1.8MB(ENABLE2K字典),我需要它可用於幾個遊戲解算器類。現在我擁有它,每個類逐行遍歷文件並生成一個哈希表(關聯數組),但是我實例化的解算器類越多,佔用的內存就越多。在Python中存儲和使用大型文本文件的最佳方式

我想要做的是導入字典文件一次,並將其傳遞給每個求解器實例,因爲他們需要它。但是,這樣做的最好方法是什麼?我應該在全局空間中導入字典,然後在解析器類中以globals()['dictionary']的形式訪問它?或者我應該導入字典,然後將其作爲參數傳遞給類構造函數?其中一個比另一個好嗎?有第三種選擇嗎?

回答

10

如果您創建了一個dictionary.py模塊,其中包含讀取該文件並生成字典的代碼,該代碼僅在第一次導入時執行。其他導入將返回對現有模塊實例的引用。因此,您的類可以:

import dictionary 

dictionary.words[whatever] 

其中dictionary.py有:

words = {} 

# read file and add to 'words' 
+0

+1:確實。模塊就像Python中的單例對象。 – martineau 2012-11-10 18:10:19

1

儘管它在本質上是一個單身人士,但通常針對全局變量的論點也適用。對於pythonic單態替代品,請查看「borg」對象。

這真的是唯一的區別。一旦創建了字典對象,除非您明確執行深層複製,否則在傳遞它時只會綁定新的引用。有意義的是,只要每個求解器實例不需要專用副本進行修改,它就一次且只能被集中構建一次。

0

根據你的字典包含,你可能有興趣在「貨架」或「anydbm」模塊。它們給你類似字典的接口(只是字符串作爲'anydbm'的鍵和項目,字符串作爲鍵,任何python對象作爲'shelve'的項目),但數據實際上是DBM文件(gdbm,ndbm,dbhash, bsddb,這取決於平臺上可用的內容。)您可能仍然希望按照您的要求在各個類之間共享實際的數據庫,但它可以避免解析文本文件的步驟以及保持全部內容 - 內存位。

1

亞當,請記住,在Python時,你說:

a = read_dict_from_file() 
b = a 

...你是不是真正複製a,從而利用更多的內存,你只是做b另一個引用同一個對象。

所以基本上你提出的解決方案的任何將在內存使用方面會好得多。基本上,閱讀字典一次,然後掛在一個參考。無論您是使用全局變量還是將其傳遞給每個實例或其他東西,您都會引用同一個對象,而不是重複它。

哪一個是Pythonic?這是一個整體'蠕蟲,但這裏是我會做的個人:

def main(args): 
    run_initialization_stuff() 
    dictionary = read_dictionary_from_file() 
    solvers = [ Solver(class=x, dictionary=dictionary) for x in len(number_of_solvers) ] 

HTH。

相關問題