适当的mmap使用 - Python

时间:2014-10-19 10:38:21

标签: python mmap

我尝试使用 mmap 从文件加载字典。 我将在简化示例中解释我的问题。实际上,我有10个文件,必须以毫秒为单位加载(或者像加载一样)。

所以我们有一本字典 - 50 mb 。我的程序应该在1秒内按键找到一个值。在这本词典中搜索不是问题,可以在1秒内完成。问题是,当sb将输入放入文本字​​段并按Enter键时,程序开始将字典加载到内存中,以便程序可以找到密钥。此加载可能需要几秒钟,但我必须在 1秒下得到结果(在按Enter键之前无法加载字典)。所以我建议使用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']
  
    
      

搜索(' apple')< - 它仍然需要很多秒

    
  

你能给我一个正确使用mmap的好例子吗?

1 个答案:

答案 0 :(得分:2)

使用2,400,000个键/值(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 平均

任务完成了吗?