在Python中人为地创建内存使用

时间:2016-06-17 18:39:41

标签: python performance testing memory

我试图在Python中创建一个纯内存密集型脚本用于测试目的,但我尝试的每个脚本也增加了我的cpu。我已经阅读过this post了,我还试过了,其中包括:

#!/usr/bin/python
from datetime import datetime
startTime = datetime.now()

l1 = [17]*900
l2=[]

j=0
while j<9000:
    l2=l1
    j=j+1
print "Finished in ", datetime.now() - startTime

为了将数组复制到另一个数组,但我又一次有了cpu变种。

已更新 那么,我如何才能使标准CPU利用率(一个核心100%使用率),45%的内存利用率以及几分钟后内存利用率增加到90%?

1 个答案:

答案 0 :(得分:2)

我有一些误解,我试图解决。

  • 您必须使用CPU来使用内存。没有别的办法。
  • 您的列表副本仅指定指针。你没有移动记忆。

如果您想提高内存利用率,则需要不断向列表中添加数据:

l = []
for i in range(0, 1024*1024):
    l.append("*" * 1024)

或使用与您的方法类似的东西,

l = [17] * 1024

for i in range(0, 16):
   l = l + l  # doubles the list each time.

那将分配内存。如果您想要单独衡量对它的访问权限,那么您希望循环l修改值或对它们进行求和。

sum(l)

for i in range(0, len(l)):
    l[i] += 1

最后,您的基准测试将非常简单(例如,不会解决多个内核同时访问内存,不考虑处理器缓存,前瞻,随机与串行访问等)使用Python也不是最佳选择,因为您无法完全控制内存分配和垃圾回收。

适当的内存基准测试是一个很深的主题......

编辑:

这是你要求的,或多或少:

from datetime import datetime
from datetime import timedelta

memory1 = "*" * 1024*1024*1024

start = datetime.now()

j = 0

while (datetime.now() - start) < timedelta(minutes=1):
    j += 1

memory2 = "*" * 1024*1024*1024

while (datetime.now() - start) < timedelta(minutes=2):
    j += 1

您可以调整memory1memory2以获得40%和90%,具体取决于您的实际系统大小。程序在分配字符串时需要使用CPU。它首先必须从内核请求内存,但是必须用'*'填充它,否则内存将只是虚拟内存。如果你用C语言写这个,你可以在每个4k页面中触摸一个字节。