正确使用mmap - Python

2 投票
1 回答
3705 浏览
提问于 2025-04-28 09:17

我正在尝试使用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秒

任务完成了吗?

撰写回答