正确使用mmap-Python

正确使用mmap-Python,python,mmap,Python,Mmap,我正在尝试使用mmap从文件加载词典。 我将用简化的例子来解释我的问题。在real中,我有10个文件,必须在毫秒内加载(或者像加载一样) 因此,让我们有一本字典-50MB。我的程序应该在1秒内通过键找到一个值。在这本词典中搜索不是问题,它可以在1秒之内完成。问题是,当sb将一个输入放入文本字段并按enter键时,程序开始将字典加载到内存中,以便程序可以找到一个键。此加载可能需要几秒钟,但我必须在1秒的时间内得到结果(在按enter键之前无法加载字典)。所以我被推荐使用mmap模块,它应该快得多

我正在尝试使用mmap从文件加载词典。 我将用简化的例子来解释我的问题。在real中,我有10个文件,必须在毫秒内加载(或者像加载一样)

因此,让我们有一本字典-50MB。我的程序应该在1秒内通过键找到一个值。在这本词典中搜索不是问题,它可以在1秒之内完成。问题是,当sb将一个输入放入文本字段并按enter键时,程序开始将字典加载到内存中,以便程序可以找到一个键。此加载可能需要几秒钟,但我必须在1秒的时间内得到结果(在按enter键之前无法加载字典)。所以我被推荐使用mmap模块,它应该快得多

我不能谷歌一个好的例子。我试过这个(我知道这是一个不正确的用法)


使用2400000个键/值(52.7兆字节)对的示例文件搜索('apple'),例如:

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秒的时间内找到单个值

因为我知道我的文件的结构,所以我可以使用这个快捷方式。不过,应根据您的确切文件结构进行调整:

读入文件并手动搜索已知模式(搜索整个文件中的唯一字符串,然后使用逗号分隔符和换行符)

这一切的时机:平均0.43s


任务完成了?

为什么你认为mmap比普通的文件IO功能更快?@Kay因为(在我的大学里)有人告诉我,mmap只加载某个时刻需要的部分文件,所以它不需要将整个文件加载到内存中,这需要很多秒。这就是我应该使用mmap的原因。
mmap
的目的是实现请求分页。这意味着只有在您第一次访问某个特定的数据段时,它才会从磁盘读入内存(但随后会留在内存中)。这意味着重复访问文件的相同块并在文件中来回搜索将非常快。但是,由于出于您的目的,您基本上需要随机访问整个文件,因此使用
mmap
显然没有帮助,反而会使事情变得更糟。“在按enter键之前无法加载字典”-为什么?也许可以选择使用sqlite数据库而不是酸洗?
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")
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