Ответ 1
Один простой способ:
some_str = ' ' * 512000000
Казалось, что это неплохо работает в моих тестах.
Изменить: в Python 3 вместо этого вы можете использовать bytearray(512000000)
.
Просто для эксперимента, и Fun... Я пытаюсь создать приложение, которое "намеренно" потребляет RAM столько, сколько мы укажем немедленно. например Я хочу потреблять 512 МБ ОЗУ, тогда приложение будет потреблять 512 МБ напрямую.
У меня есть поиск в Интернете, большинство из которых использует цикл while для заполнения ram с переменной или данными. Но я думаю, что это медленный способ заполнения ОЗУ и, возможно, также неточно.
Я ищу библиотеку в python для управления памятью. и наткнулся на эти http://docs.python.org/library/mmap.html. Но не могу понять, как использовать эту библиотеку, чтобы съесть RAM Space одним выстрелом.
Я когда-либо видел приложение mem-eater, но не знаю, как они были написаны...
Итак, есть ли другое лучшее предложение для быстрого заполнения ОЗУ со случайными данными? Или я должен просто использовать цикл while для заполнения данных вручную, но с помощью Multi-Threading, чтобы сделать его быстрее?
Один простой способ:
some_str = ' ' * 512000000
Казалось, что это неплохо работает в моих тестах.
Изменить: в Python 3 вместо этого вы можете использовать bytearray(512000000)
.
Вы не сможете выделить всю память, которую вы можете использовать с конструкциями типа
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
Вы можете выделить огромное количество бара за счет выполнения:
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 минут
Сохранить его в .pyw для выделения фона
Если это не затормозит ваш компьютер, попробуйте увеличить значение
Чтобы быстро остановить его, сохраните этот код в файле .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")
Вот версия ответа 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()