【发布时间】:2016-10-15 03:11:04
【问题描述】:
编辑:使用 Win10 和 python 3.5
我有一个函数,它使用 mmap 从文件中删除某个偏移量的字节:
def delete_bytes(fobj, offset, size):
fobj.seek(0, 2)
filesize = fobj.tell()
move_size = filesize - offset - size
fobj.flush()
file_map = mmap.mmap(fobj.fileno(), filesize)
file_map.move(offset, offset + size, move_size)
file_map.close()
fobj.truncate(filesize - size)
fobj.flush()
它运行得非常快,但是当我在大量文件上运行它时,内存很快就会填满,我的系统变得无响应。
经过一些实验,我发现 move() 方法是这里的罪魁祸首,尤其是被移动的数据量(move_size)。
正在使用的内存量等于mmap.move() 移动的数据总量。
如果我有 100 个文件,每移动约 30 MB,则内存将充满约 3GB。
为什么移动的数据没有从内存中释放出来?
我尝试过的没有效果的事情:
- 在函数结束时调用
gc.collect()。 - 重写函数以小块移动。
【问题讨论】:
-
您使用的是什么操作系统? Python 版本也是如此。
-
能否请您检查一下您的python进程或操作系统是否使用了内存?
-
对不起,忘了说:我在 Win10 和 python 3.5 上。如何检查内存是否被python或OS使用?
-
Windows 10 不包含任务管理器系统实用程序吗?
-
操作系统倾向于将已经使用过的页面保留在缓冲区缓存中,因为通常它们很可能会再次使用。也许您的缓冲区缓存已满。还;你真的在某处关闭文件对象吗?
标签: python performance memory mmap