web-dev-qa-db-ja.com

Pythonを使用してメモリを食べる方法?

ちょうど実験のために、そして楽しい...私はすぐに指定したのと同じくらい「目的に応じて」RAM=消費できるアプリを作成しようとしています。たとえば、512 MBのRAMを消費したい場合、アプリは512 MBを直接消費します。

私はウェブで検索しましたが、それらのほとんどは、whileループを使用して、RAMに変数またはデータを入力しています。しかし、RAMを入力するのは遅い方法であり、どちらも正確ではないかもしれません。

私はpythonメモリ管理についてのライブラリを探しています。これらに遭遇しました http://docs.python.org/library/mmap.html 。しかし、できますこれらのライブラリを使用してRAMスペースを一度に食べる方法を理解できません。

Mem-eaterアプリケーションを見たことがありますが、それらがどのように記述されたかわかりません...

RAM=ランダムデータをすぐに埋める)に他に良い提案はありますか?または、whileループを使用して手動でデータを埋めるだけで、マルチスレッドを使用してデータを高速化する必要がありますか?

29
Yeo

簡単な方法の1つは次のとおりです。

_some_str = ' ' * 512000000
_

私のテストではかなりうまく機能しているようです。

編集:Python 3の場合、代わりにbytearray(512000000)を使用できます。

36
Jasmijn

次のような構成を使用して、できるすべてのメモリを割り当てることはできません。

s = ' ' * BIG_NUMBER

次のようにリストを追加することをお勧めします

a = []
while True:
    print len(a)
    a.append(' ' * 10**6)

以下は、メモリ割り当ての制限についてより深い洞察を与える長いコードです。

import os
import psutil

PROCESS = psutil.Process(os.getpid())
MEGA = 10 ** 6
MEGA_STR = ' ' * MEGA

def pmem():
    tot, avail, percent, used, free = psutil.virtual_memory()
    tot, avail, used, free = tot / MEGA, avail / MEGA, used / MEGA, free / MEGA
    proc = PROCESS.get_memory_info()[1] / MEGA
    print('process = %s total = %s avail = %s used = %s free = %s percent = %s'
          % (proc, tot, avail, used, free, percent))

def alloc_max_array():
    i = 0
    ar = []
    while True:
        try:
            #ar.append(MEGA_STR)  # no copy if reusing the same string!
            ar.append(MEGA_STR + str(i))
        except MemoryError:
            break
        i += 1
    max_i = i - 1
    print 'maximum array allocation:', max_i
    pmem()

def alloc_max_str():
    i = 0
    while True:
        try:
            a = ' ' * (i * 10 * MEGA)
            del a
        except MemoryError:
            break
        i += 1
    max_i = i - 1
    _ = ' ' * (max_i * 10 * MEGA)
    print 'maximum string allocation', max_i
    pmem()

pmem()
alloc_max_str()
alloc_max_array()

これは私が得る出力です:

process = 4 total = 3179 avail = 2051 used = 1127 free = 2051 percent = 35.5
maximum string allocation 102
process = 1025 total = 3179 avail = 1028 used = 2150 free = 1028 percent = 67.7
maximum array allocation: 2004
process = 2018 total = 3179 avail = 34 used = 3144 free = 34 percent = 98.9
8
markolopa

ここに私のために働いたmarkolopaの答えのバージョンがあります:

import os
import psutil

PROCESS = psutil.Process(os.getpid())
MEGA = 10 ** 6
MEGA_STR = ' ' * MEGA


def pmem():
    try:
        tot, avail, percent, used, free, active, inactive, buffers = psutil.virtual_memory()
    except ValueError:
        tot, avail, percent, used, free, active, inactive, buffers, cached, shared = psutil.virtual_memory()
    tot, avail, used, free = tot / MEGA, avail / MEGA, used / MEGA, free / MEGA
    proc = PROCESS.memory_info()[1] / MEGA
    print('process = %s total = %s avail = %s used = %s free = %s percent = %s'
          % (proc, tot, avail, used, free, percent))


def alloc_max_array():
    i = 0
    ar = []
    while True:
        try:
            #ar.append(MEGA_STR)  # no copy if reusing the same string!
            ar.append(MEGA_STR + str(i))
        except MemoryError:
            break
        i += 1
    max_i = i - 1
    print('maximum array allocation:', max_i)
    pmem()


def alloc_max_str():
    i = 0
    while True:
        try:
            a = ' ' * (i * 10 * MEGA)
            del a
        except MemoryError:
            break
        i += 1
    max_i = i - 1
    _ = ' ' * (max_i * 10 * MEGA)
    print('maximum string allocation', max_i)
    pmem()

pmem()
alloc_max_str()
alloc_max_array()
1
Brian

を実行すると、大量のRAMを割り当てることができます

while True:
    for i in range(0,100000000):
        Gig = 1024*1024*1024*2#A Gig multiplied by 2
        a = 787878788888888888888888888888 * (i * Gig)
        a = a * i
        print str(a)*2

このコードが5分でPCをフリーズさせることがわかりました
バックグラウンドRAM割り当て用に.pywで保存
パソコンがフリーズしない場合は、aの値を増やしてみてください
すばやく停止するには、このコードを.pyファイルに保存します:

#First we send signals
os.system("TASKKILL /im pythonw.exe")
os.system("TASKKILL /im python.exe") 
print "Forcefull termination"
#Now we forcefully terminate
#pythonw.exe if running in idle or background
os.system("TASKKILL /im python.exe /f")
os.system("TASKKILL /im pythonw.exe /f")
os.system("pause")
1
Anonymous