2014-10-19 114 views
1

我試圖使用mmap從文件中加載字典。 我會在簡化的例子中解釋我的問題。實際上,我有10個文件,必須以毫秒爲單位加載(或者像加載一樣)。正確的mmap使用 - Python

因此,讓我們有一本字典 - 50 MB。我的程序應該在1秒內通過鍵找到一個值。在這本詞典中搜索不是問題,它可以在1秒內完成。問題是當sb在文本字段中輸入一個輸入並按回車時,程序開始將字典加載到內存中,以便程序可以找到一個密鑰。此加載可能需要幾秒鐘,但我必須在1秒內得到結果(在按下回車鍵之前無法加載字典)。所以我建議使用mmap模塊,它應該快得多。

我不能谷歌一個很好的例子。我已經試過這(我知道這是一個不正確的使用)

def loadDict(): 
    with open('dict','r+b') as f: # used pickle to save 
     fmap = mmap.mmap(f.fileno(),0) 
     dictionary = cpickle.load(fmap) 
    return dictionary 


def search(pattern): 
    dictionary = loadDict() 
    return dictionary['pattern'] 

搜索( '蘋果')< - 它仍然需要多少秒

您能否給我一個正確使用mmap的好例子?

+0

爲什麼你認爲mmap比正常的文件IO功能更快? – kay 2014-10-19 10:50:02

+0

@Kay因爲我被告知(在我的大學裏),mmap只加載在某個時刻需要的文件的一部分,所以它不需要將整個文件加載到需要很多秒的內存中。這就是我應該使用mmap的原因。 – 2014-10-19 10:52:40

+0

'mmap'的目的是[將文件映射到內存](http://en.wikipedia.org/wiki/Mmap)並實現* demand paging *。這意味着一個特定的段只會在您第一次訪問時從磁盤讀取到內存中(但會保留在內存中)。這意味着**反覆**訪問文件的相同塊並在文件中查找和返回將非常快。但是,因爲你的目的,你基本上需要隨機訪問整個文件,使用'mmap'顯然不會在這裏幫助,但反而會讓事情變得更糟。 – 2014-10-19 10:54:56

回答

2

使用2400000間的鍵/值(52.7兆字節)對諸如的示例文件:

key1,value1 
key2,value2 
etc , etc 

創建示例文件:

with open("stacktest.txt", "a") as f: 
    contents = ["key" + str(i) + ",value" + str(i) for i in range(2400000)] 
    f.write("\n".join(contents) + "\n") 

什麼是由具有以構建字典實際慢。讀取50mb的文件足夠快。在這種尺寸的文本牆上找到一個價值也足夠快。使用它,您將能夠在1秒內找到單個值。

由於我知道我的文件的結構,我可以使用這個快捷方式。這應該調整到您的確切文件結構:

讀入文件並手動搜索已知模式(在整個文件中搜索唯一字符串,然後使用逗號分隔符和換行符分隔符)。

對於這一切
with open("stacktest.txt") as f: 
    bigfile = f.read() 
    my_key = "key2399999" 
    start = bigfile.find(my_key) 
    comma = bigfile[start:start+1000].find(",") + 1 
    end = bigfile[start:start+1000].find("\n") 
    print bigfile[start+comma:start+end] 
    # value2399999 

時間:0.43s平均

任務完成了?