2016-12-12 14 views
4

PythonプログラムのRAM使用量を半分に制限しようとしているため、すべてのRAMが使用されているときに完全にフリーズしないため、次のコードを使用しています仕事と私のラップトップは、まだ凍結されています。私はmain関数から呼び出す他の関数を使用していRAM使用量をPythonプログラムに制限する

import sys 
import resource 

def memory_limit(): 
    rsrc = resource.RLIMIT_DATA 
    soft, hard = resource.getrlimit(rsrc) 
    soft /= 2 
    resource.setrlimit(rsrc, (soft, hard)) 

if __name__ == '__main__': 
    memory_limit() # Limitates maximun memory usage to half 
    try: 
     main() 
    except MemoryError: 
     sys.stderr.write('MAXIMUM MEMORY EXCEEDED') 
     sys.exit(-1) 

私は間違っていますか?

ありがとうございます。

PD:私はすでにこれについて検索し、私が置かれているが、それはまだ働いていないコードを発見した...

+0

おそらく、あなたは 'ulimit'または' prlimit'をPythonスクリプトの外側にしたいでしょう。あるいは、メモリに限られた 'cgroup'を設定し、そこでスクリプトを実行してください。私は自己制限しようとするのが最善の考えであるかどうかは確信していません - プロセスのメモリを割り当てる必要がある場合にはどうなりますか? – twalberg

+0

'soft/= 100'、またはsoft // = 2を試しましたか? – Gribouillis

+0

私はそれがすぐに終了すると言います@Gribouillis –

答えて

2

[OK]をので、私はいくつかの研究を行い、Linuxシステムからメモリを取得するための関数を見つけましたここでは:Determine free RAM in Pythonと私はちょうど利用可能な空きメモリを取得し、その半分として利用可能な最大メモリを設定するビットを変更しました。

コード:get_memory() * 1024/2は半分に設定するところの半分に設定する

def memory_limit(): 
    soft, hard = resource.getrlimit(resource.RLIMIT_AS) 
    resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024/2, hard)) 

def get_memory(): 
    with open('/proc/meminfo', 'r') as mem: 
     free_memory = 0 
     for i in mem: 
      sline = i.split() 
      if str(sline[0]) in ('MemFree:', 'Buffers:', 'Cached:'): 
       free_memory += int(sline[1]) 
    return free_memory 

if __name__ == '__main__': 
    memory_limit() # Limitates maximun memory usage to half 
    try: 
     main() 
    except MemoryError: 
     sys.stderr.write('\n\nERROR: Memory Exception\n') 
     sys.exit(1) 

ラインは、(それはバイトにあります)resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024/2, hard))です。

これは、今後同じ問題で他の人に役立つことを願っています! =)