2014-07-26 36 views
1

我正在嘗試編寫一個程序,該程序使用已排序字母的擱置數據庫作爲關鍵字,以及可以將它們作爲值創建的單詞列表。例如:擱置是否真的很慢,需要大量的內存,或者我做錯了什麼?

db['mnoo'] = ['moon', 'mono'] 

因此,我寫了一個函數,它接受一個文件名並將其加載到擱置中。第一部分,將文件轉換成與擱置的佈局相同的字典,但擱置部分需要很長時間。

我試着用~100k條目的字典,每個值都是一個列表。似乎每1000個輸入需要15-20秒,每個輸入似乎需要〜1kb的空間。這是否正常?
代碼:

def save_to_db(filename, shelve_in='anagram_db'): 
    dct = anagrams_from_list(process_file(filename)) 

    with shelve.open(shelve_in, 'c') as db: 
     for key, wordlist in dct.items(): 
      if not key in db: 
       db[key] = wordlist 
      else: 
       db[key].extend(wordlist) 

編輯:只是一個快速澄清:在字典每個列表是約1-3個字,不宜過大

回答

4

首先 - 是的,擱置的默認後臺泡菜速度緩慢且效率低下,您的最佳選擇是使用不同的東西。

其次 - 通過編輯條目,一旦它們在那裏編輯就會變得更糟,而不是在序列化它們之前將它們放入內存中的最終狀態。

dct = anagrams_from_list(process_file(filename)) 
for key, wordlist in dct.items(): 
    content = {} 
    for key, wordlist in dct.iteritems(): 
    if not key in content: 
     content[key] = wordlist 
    else: 
     content[key].extend(wordlist) 

for k, v in content.iteritems(): 
    db[k] = v 

如果你想要一個高效的數據庫,我會看看其他地方。 tokyocabinet,kyotocabinet,SQLite,BDB;選項很多。

+0

嗯,我明白了。因此,如果我已經有數據庫中的數據,並且想將它與新數據結合起來,那麼加載所有內容,進行更改並將其保存回來會更快?我實際上只是因爲我是Python新手,並且正在閱讀「think python」而使用擱置,並且在那裏使用它來進行一些練習。在將來可能不會再使用它:P。 – Nescio

+0

取決於您正在更改的_much_數據的方式;沒有一條硬性規定。 –

+2

貨架可以使用多個後端,如gdbm或bdb,只有後備pickle後端真的很慢。 – jtaylor

相關問題