web-dev-qa-db-ja.com

制限RAM使用量pythonプログラム

RAMプログラムの使用量をPythonプログラムから半分に制限するため、すべてのRAMが使用されています。このため、次のコードを使用していますが、機能せず、ラップトップがまだフリーズしています。

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)

main関数から呼び出す他の関数を使用しています。

何が悪いのですか?

前もって感謝します。

PD:私はすでにこれについて検索して、入れたコードを見つけましたが、それでもまだ機能していません...

17
Ulises CT

さて、私はいくつかの調査を行い、Linuxシステムからメモリを取得する関数をここに見つけました: Determine free RAM と私はそれを取得するために少し変更しました利用可能な空きメモリだけを使用して、利用可能な最大メモリを半分として設定します。

コード:

_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))で、get_memory() * 1024 / 2は半分に設定します(バイト単位)。

これが将来同じ問題で他の人を助けることができることを願っています! =)

17
Ulises CT

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da77

それを使用する方が良いです:

if str(sline[0]) == 'MemAvailable:':
            free_memory = int(sline[1])
            break

1TBのRAMが搭載されたマシンで8GBの使用可能なメモリが返された回答コード

1
The_Pingu