有什么好办法限制 Python 的内存分配吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
HawkinsSherpherd
V2EX    Python

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

  •  1
     
  •   HawkinsSherpherd 343 天前 2835 次点击
    这是一个创建于 343 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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 代码里的限制内存分配的方法呢?

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

    pbar.update(len(block))
    gc.collect()
    zsj1029
        6
    zsj1029  
       343 天前 via iPhone
    只要不会 oom 就不用管吧
    jimrok
        7
    jimrok  
       341 天前
    看这个代码是不是把文件全部读入内存去解压,如果内存不足,可能要 OOM ,是否能改成流式处理?
    lshu
        8
    lshu  
       340 天前
    f_out.write(block) 这行后面接一个 f_out.flush() 方法,内存写到硬盘中
    Maerd
        9
    Maerd  
       332 天前
    这种大文件,就不适合在内存中操作,正确的方法是使用虚拟内存
    import mmap
    可以将直接将一个硬盘文件变为虚拟内存
    这样的进行写入的好处不只是省内存,还减少了一次用户态和内核态之间的切换
    beyondstars
        10
    beyondstars  
       327 天前
    这种压缩解压缩的任务为什么不用流 (stream) 式操作?
    hotea
        11
    hotea  
       327 天前
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2693 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 13:45 PVG 21:45 LAX 05:45 JFK 08:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86