Comment manger la mémoire en utilisant Python?

Juste pour l'expérience, et de Plaisir... J'essaie de créer une application qui peut "intentionnellement" consommer RAM autant que nous le spécifions immédiatement. par exemple, je veux consommer 512 MB RAM, puis l'application consommera 512 MB directement.

j'ai la recherche sur le web, la plupart d'entre eux utilisent while loop pour remplir la ram avec une variable ou des données. Mais je pense que c'est une manière lente de remplir la mémoire vive et pourrait ne pas être exacte non plus.

je cherche une bibliothèque en python sur la gestion de la mémoire. et est venu à travers ces http://docs.python.org/library/mmap.html<!--6. Mais je ne sais pas comment utiliser cette bibliothèque pour manger L'espace RAM en un seul coup.

j'ai déjà vu une application mem-eater, mais je ne sais pas comment elle a été écrite...

alors, y a-t-il une autre meilleure suggestion pour remplir la RAM avec des données aléatoires immédiatement? Ou devrais-je simplement utiliser while loop pour remplir les données manuellement, mais avec multi-Threading pour le rendre plus rapide?

21
demandé sur AstroCB 2011-06-11 22:43:26

4 réponses

une façon simple pourrait être:

some_str = ' ' * 512000000

Semblait fonctionner assez bien dans mes tests.

Modifier: en Python 3, vous pouvez utiliser bytearray(512000000) à la place.

32
répondu Robin 2011-06-11 18:51:36

vous ne pourrez pas allouer toute la mémoire que vous pouvez utiliser en utilisant des constructions comme

s = ' ' * BIG_NUMBER

Il est préférable d'ajouter une liste comme suit:

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

voici un code plus long qui donne plus de détails sur les limites d'allocation de mémoire:

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()

C'est le résultat que j'obtiens:

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
5
répondu markolopa 2013-03-19 09:00:58

Voici une version de la réponse de markolopa qui a fonctionné pour moi:

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
répondu Brian 2017-03-30 23:07:57

vous pouvez allouer une énorme quantité de ram en exécutant:

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

j'ai trouvé ce code de congélation mon pc en 5 minutes

l'Enregistrer dans un .pyw pour le fond d'allocation de ram

si elle ne gèle pas votre pc essayez d'augmenter la valeur de a

pour l'arrêter rapidement,enregistrez ce code en a. PY file:

#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
répondu Anonymous 2018-03-14 13:13:31