2015-05-15 115 views
20

我在16GB RAM和64位操作系統的Linux機器上運行Python 2.7。我寫的python腳本可能會將太多的數據加載到內存中,這會使機器變慢,甚至無法再殺死進程。限制內存使用量?

雖然我可以通過調用限制內存:運行腳本之前

ulimit -v 12000000 
在我的殼

,我想包括腳本本身限制選項。在我看來,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) 

什麼都不做。

我在做什麼錯?我在網上找不到任何實際的使用示例。

+0

是否有任何空間讓程序更具內存效率? – TigerhawkT3

+1

有,但那需要一段時間。目前,我需要測試它並確保它不會關閉計算機。並且,對內存進行失效保護也將在以後使用。 – Arne

+1

因爲它是在Python 2.7中,所以如何切換到Python 3並在程序中使用2到3的轉換器?與Python 2相比,Python 3有幾個性能改進,其中一些與內存相關。 – TigerhawkT3

回答

12

resource.RLIMIT_VMEM是資源corresponding to ulimit -v

RLIMIT_DATAonly affects brk/sbrk system callsnewer memory managers tend to use mmap instead

第二件要注意的是,ulimit/setrlimit隻影響當前過程及其未來的孩子。

關於AttributeError: 'module' object has no attribute 'RLIMIT_VMEM'信息:resource module docs提及這種可能性:

This module does not attempt to mask platform differences — symbols not defined for a platform will not be available from this module on that platform.

根據連接到上面的bashulimit source,它使用RLIMIT_AS如果RLIMIT_VMEM沒有定義。

+1

我不使用多線程,所以我希望這不是問題。但是,當我進入'RLIMIT_DATA',我收到以下錯誤信息: '回溯(最近通話最後一個): 文件 「my_script.py」,線路417,在 sys.exit(main()中) 文件「my_script。py「,第391行,主要爲 _,hard = resource.getrlimit(resource.RLIMIT_VMEM) AttributeError:'module'object has no attribute'RLIMIT_VMEM'' 從您引用的列表中,可以找到所有字段 - 除這個,我正試圖用Python 3.x來運行它.. – Arne

+0

謝謝澄清! – Arne