2014-10-19 43 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平均

任务完成了?