正确使用mmap - Python
我正在尝试使用mmap从文件中加载一个字典。让我用一个简单的例子来解释我的问题。实际上,我有10个文件,需要在毫秒级别内加载(或者说像是被加载一样)。
假设我们有一个50MB的字典。我的程序应该在1秒内通过键找到一个值。搜索这个字典并不成问题,远远可以在1秒内完成。问题在于,当有人在文本框中输入内容并按下回车时,程序开始将字典加载到内存中,以便能够找到对应的键。这个加载过程可能需要几秒钟,但我必须在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']
search('apple') <- 这仍然需要很多秒
你能给我一个正确使用mmap的好例子吗?
1 个回答
6
这里有一个例子,文件里有240万个键值对(大约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")
其实,慢的地方在于构建字典的过程。读取一个50兆字节的文件速度还不错。在这么大一块文字中找到一个值也挺快的。用这种方法,你可以在不到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.43秒
任务完成了吗?