首页 > 解决方案 > Python mmap“内存泄漏”

问题描述

我有一个相当大的文件(磁盘上约 4gb),我想用 Python 的mmap模块访问它以熟悉内存映射。我有一个 64 位系统,并且正在运行类似于以下示例的内容。当我运行它时,我注意到这个进程的内存消耗不断增加。我已经对其进行了分析,但pympler没有任何突出之处。有人可以向我指出一些资源,这些资源可能会描述幕后发生的事情以及如何纠正这个问题(这样我就可以扫描文件而不会出现这种“内存泄漏”消耗我所有的内存)?谢谢!

import mmap                                                                                                                                                                                                                                  

with open("/path/to/large.file", "r") as j:
    mm = mmap.mmap(j.fileno(), 0, access=mmap.ACCESS_READ)

pos = 0
for i in range(mm.size()):
    new_pos = mm.find(b"10", pos)
    print(new_pos)
    pos = new_pos + 1

编辑该文件看起来像这样:

0000001, data
0000002, more data
...
...

并且在第一个位置有这么多的连续值将会有很多命中find(b"10")

标签: pythonmemory-leaksmmap

解决方案


收集流程的实时核心并使用 chap(可在https://github.com/vmware/chap获得的开源软件)分析该核心。

以下是与此用例相关的一些命令:

describe used

这将描述所有使用的分配(由 python 或本机代码分配),但不会直接告诉您任何已映射的区域。

describe free

这将显示已释放但相关空间尚未归还给操作系统的分配。

describe writable
describe readonly

这些将告诉您更大的区域,分别是可写或只读的。在您的情况下,在您为 mmapped 分配指定 ACCESS.READ 的情况下,该分配(如果仍然存在)将被视为“描述只读”输出的一部分或此类区域的一部分中的未知区域。


推荐阅读