2016-09-19 60 views
0

我想使用擱置模塊來存儲幾個字典,但是,我遇到了大小問題。我使用Python 3.5.2和最新的擱置模塊。Python擱置模塊的大小問題

我有一個單詞列表,我想創建一個從bigrams(角色級別)到單詞的地圖。結構看起來像這樣:

'aa': 'aardvark', 'and', ... 
'ab': 'absolute', 'dab', ... 
... 

我讀了一個由大約130萬字組成的大文件。所以字典變得很大。這是代碼:

self.bicharacters // part of class 
def _create_bicharacters(self): 
    ''' 
    Creates a bicharacter index for calculating Jaccard coefficient. 
    ''' 
    with open('wordlist.txt', encoding='ISO-8859-1') as f: 
     for line in f: 

      word = line.split('\t')[2] 

      for i in range(len(word) - 1): 
       bicharacter = (word[i] + word[i+1]) 

       if bicharacter in self.bicharacters: 
        get = self.bicharacters[bicharacter] 
        get.append(word) 
        self.bicharacters[bicharacter] = get 
       else: 
        self.bicharacters[bicharacter] = [word] 

當我跑了使用普通的Python字典這段代碼,我沒有碰到的問題,但我不能放過這些類型的內存資源由於程序的其餘部分也有相當大的內存佔用。

所以我嘗試使用擱置模塊。但是,當我使用shelve運行上面的代碼時,由於磁盤上沒有更多內存,程序會在一段時間後停止,所創建的shelve db大約爲120GB,並且它仍然沒有讀取文件中的1.3M字列表的一半。我在這裏做錯了什麼?

+0

爲什麼你用'pip'安裝'shelve'?它是標準庫的一部分,它基本上是['pickle'](https://docs.python.org/3/library/pickle.html)和['dbm'](https:// docs .python.org/3 /庫/ dbm.html)。同名的[PyPI包](https://pypi.python.org/pypi/shelve)是完全不同的東西。 –

+0

您可能想重新使用此工具來使用數據庫; ['dbm'格式](https://en.wikipedia.org/wiki/Dbm)並未針對此類大型數據集進行完全優化。 –

+0

@MartijnPieters對不起,沒有通過點安裝,與其他東西混合。 –

回答

2

這裏的問題並不是密鑰的數量,而是每個密鑰引用一個單詞列表。

雖然在內存中作爲一個(巨大的)字典,但這並不是一個大問題,因爲這些單詞只是在列表之間共享;每個列表僅僅是對其他對象的引用順序,這些對象中的許多對象是相同的,因爲每個單詞只需要引用一個字符串。

shelve,但是,每個值進行酸洗和單獨地存儲,這意味着在一個列表中的詞的混凝土拷貝將不得不被存儲爲每個值。由於您的設置最終將給定的單詞添加到大量列表中,因此這會使您的數據需求劇增。

我會切換到在這裏使用SQL數據庫。 Python隨附了sqlite3。如果你爲單個單詞創建一個表格,爲每個可能的雙字節創建第二個表格,並且第三個表格簡單地鏈接在兩者之間(多對多映射,將bigram行標識鏈接到單詞行id),這可以做得很好有效率的。然後,您可以進行高效查找,因爲SQLite非常善於爲您管理內存和索引。