Python 的 mmap() 性能随时间下降

2 投票
1 回答
1667 浏览
提问于 2025-04-16 22:13

我在想,为什么Python的 mmap() 随着时间的推移性能会下降?我有一个小程序,它会对N个文件进行修改,如果设置的数量比较大 (不是特别大,比如1000个),前200个文件处理得非常快,但之后就越来越慢了。看起来我应该定期释放内存,但我不知道怎么做,更重要的是,为什么Python不自动处理这个问题呢。

有没有人能帮帮我?

-- 编辑 --

大概是这样的:

def function(filename, N):
   fd = open(filename, 'rb+')
   size = os.path.getsize(filename)
   mapped = mmap(fd.fileno(), size)

   for i in range(N):
      some_operations_on_mmaped_block()

   mapped.close()

1 个回答

6

你的操作系统会把通过mmap映射的页面缓存到内存中。这样读取和写入的速度就跟内存一样快。脏页面(即被修改但还没写入磁盘的页面)最终会被刷新到磁盘上。在Linux系统上,性能会很好,直到你开始刷新这些脏页面,这个过程是由一个叫做vm.dirty_ratio的设置来控制的。一旦你开始把脏页面写入磁盘,读取操作就会和写入操作在忙碌的输入输出设备上争抢资源。还有一个需要考虑的因素是,你的操作系统是否有足够的内存来缓存所有的文件(可以在top命令的输出中看到缓冲区的计数)。所以我建议你在程序运行时观察一下“vmstat 1”的输出,看看缓存和缓冲区的计数是如何增加的,直到你突然开始进行输入输出操作。

撰写回答