有什么好办法限制 Python 的内存分配吗?

3 天前
 HawkinsSherpherd

这是一段会吃掉几乎所有可用内存的代码:

def Decompress_Gzip_With_Progress_Bar(gzip_path, output_path):
    with gzip.open(gzip_path, 'rb') as f_in:
        with open(output_path, 'wb') as f_out:
            file_size = Get_Uncompressed_Size(gzip_path)
            chunk_size = 1024 * 1024
            with tqdm(total=file_size, unit='B', unit_scale=True, desc="Decompressing " + gzip_path) as pbar:
                for block in iter(lambda: f_in.read(chunk_size), b''):
                    f_out.write(block)
                    pbar.update(len(block))

它被用于解压一个解压后大概 4G 大小的文件。

直接在我的 16G 内存的开发虚拟机上运行,它会吃掉所有的内存。

但是,如果我把它放到一个分配 1G 内存的容器里,它不仅能运行,甚至还能运行得更快。

我试过用 resource 限制内存分配,但是它还是会吃满所有内存。

有没有什么能直接写到 Python 代码里的限制内存分配的方法呢?

1347 次点击
所在节点    Python
8 条回复
Donaldo
3 天前
和你的容器办法类似,但不用这么重,直接把这段代码丢进一个 cgroup 里面,这个 cgroup 限制好内存就行
Donaldo
3 天前
Windows 没有 cgroup ,我找到一个工具:https://github.com/lowleveldesign/process-governor
fighterhit
3 天前
那说明基本都是 cache 啊,如果 rss 常驻内存应该早 oom 了
paopjian
3 天前
吃满内存的行为是操作系统的缓存吧, 如果其他程序再需要,会清理内容?
sagaxu
3 天前
循环内加入强制 gc 试试

pbar.update(len(block))
gc.collect()
zsj1029
3 天前
只要不会 oom 就不用管吧
jimrok
1 天前
看这个代码是不是把文件全部读入内存去解压,如果内存不足,可能要 OOM ,是否能改成流式处理?
lshu
39 分钟前
f_out.write(block) 这行后面接一个 f_out.flush() 方法,内存写到硬盘中

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1102427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX