我不知道我对了解mmap所缺少的知识。我只是想不通。但是让我这样问我的问题:


我有很多文件,例如3个文件块,大小分别为s1,s2,s3。
s1,s2和s3均小于Mmap的大小限制(SLM),即s1 但是s1,s2和s3的总和大于mmap的大小限制,即s1 + s2 + s3> SLM。
我正在考虑映射3个文件块,并将mmap对象缓存在Python字典中,一个mmap对象用于文件块。


我的问题是:


文件块大小的总和(s1 + s2 + s3)是否可以超过mmap的大小限制?
在这种情况下,mmap如何分配或使用内存和虚拟内存?


任何答案将不胜感激。

最佳答案

我不确定您所谈论的限制是什么,这很可能取决于系统。在Linux中,可以映射的数量限制取决于RLIMIT_AS和内核配置。根据内存布局的不同,通常mmap比malloc(堆分配,大多数Python对象所在的堆)更多。

每mmap限制​​可能取决于系统,也可能仅取决于您的虚拟内存中哪些可用的连续范围。查看Linux中的/proc/$$/maps或Windows上的调试工具(例如MHS),将告诉您外观。主要限制是传递给mmap的偏移量必须为mmap.ALLOCATIONGRANULARITY的倍数。由于每个mmap必须找到一个适合虚拟内存映射的间隙,因此多个mmap通常会超过单个可能mmap的总大小。可能存在一些其他限制,例如,仅在特定范围内的自动分配地址,并且范围仅限于内核使用。

在任何时候找到映射数量的限制也就不足为奇了;如果您要进行许多映射,则可能必须关闭不需要的映射。

Gustavo Duarte发表了一篇相当不错的文章,名为Anatomy of a Program in Memory,该文章显示了虚拟内存通常包含的内容以及不同操作系统配置的一些示例。比例取决于系统配置(例如,请参见/ 3GB开关),并且64位系统可以具有更多的空间。

关于python - mmap多个文件块并缓存mmap对象(Python),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20028494/

10-14 22:56