[英]How to limit memory usage within a python process
我在具有16GB Ram和64位操作系統的Linux機器上運行Python 2.7。 我寫的一個python腳本可以將太多的數據加載到內存中,這會使機器速度降低到我甚至無法再殺死進程的程度。
雖然我可以通過調用來限制內存:
ulimit -v 12000000
在運行腳本之前的shell中,我想在腳本本身中包含一個限制選項。 在我看的每個地方, resource
模塊被引用為具有與ulimit
相同的功能。 但是打電話:
import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))
在我的腳本開頭做什么都沒有。 即使設置低至12000的值也從未使過程崩潰。 我嘗試使用RLIMIT_STACK
,結果相同。 奇怪的是,打電話:
import subprocess
subprocess.call('ulimit -v 12000', shell=True)
什么都不做。
我究竟做錯了什么? 我在網上找不到任何實際的用法示例。
編輯:對於任何好奇的人,使用subprocess.call
不起作用,因為它創建了一個(驚喜,驚喜!)新進程,它獨立於當前python程序運行的進程。
resource.RLIMIT_VMEM
是與ulimit -v
對應的資源。
RLIMIT_DATA
僅影響brk/sbrk
系統調用,而較新的內存管理器傾向於使用mmap
。
需要注意的第二件事是ulimit
/ setrlimit
只影響當前進程及其未來的子進程。
關於AttributeError: 'module' object has no attribute 'RLIMIT_VMEM'
消息: resource
模塊docs提到了這種可能性:
此模塊不會嘗試屏蔽平台差異 - 在該平台上,此模塊將無法使用未為平台定義的符號。
根據bash
ulimit
源連接到上述,它使用RLIMIT_AS
如果RLIMIT_VMEM
沒有定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.