mmap多个文件块和缓存mmap对象(Python)

时间:2013-11-17 07:50:30

标签: python mmap

我不知道我理解mmap的错误。我只是想不出来。但是让我这样问我的问题:

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

我的问题是:

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

任何答案都会受到谴责。

1 个答案:

答案 0 :(得分:1)

我不确定你说的是哪个限制,这可能与系统有关。在Linux中,可以映射多少的限制取决于RLIMIT_AS和内核配置。根据内存布局,通常可以使用mmap而不是malloc(堆分配,大多数Python对象所在的位置)。

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

在任何时候找到映射数量的限制也就不足为奇了;如果你做了很多映射,你可能需要关闭那些你不需要的映射。

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