【问题标题】:Python's mmap() performance down with timePython 的 mmap() 性能随时间下降
【发布时间】:2026-01-29 13:10:01
【问题描述】:

我想知道为什么 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()

【问题讨论】:

  • 我们能看一些代码吗?这可能说明了 GC 不工作的原因。
  • 添加了代码,实际上几乎是所有内容,在循环中,如果语句为真,我对文件进行 3 次操作。
  • 您是否真的看过top 或任务管理器或任何适合您平台的东西? Python是否占用越来越多的内存? CPU是固定的吗?还是只是你的硬盘缓存被填满了?
  • 当它运行缓慢时,您查看过操作系统统计信息吗?想知道你是不是在换。那将表明存在 gc 问题。映射到null 的设置能否改善或解决您的问题?

标签: python performance memory mmap


【解决方案1】:

您的操作系统将 mmap 的页面缓存在 RAM 中。从缓存中读取和写入以 RAM 速度进行。脏页最终会被刷新。在您必须开始刷新页面之前,在 Linux 上性能会很好,这由 vm.dirty_ratio sysctl 变量控制。一旦您开始将脏页刷新到磁盘,读取将与繁忙的 IO 总线/设备上的写入竞争。要考虑的另一件事是您的操作系统是否有足够的 RAM 来缓存所有文件(顶部输出中的缓冲区计数器)。所以我会在你的程序运行时观察“vmstat 1”的输出,并观察缓存/缓冲区计数器的上升,直到你突然开始执行 IO。

【讨论】:

    最近更新 更多