我们的游戏程序会将所有玩家的数据初始化到内存中。我的目的是减少不必要的记忆。我追踪了这个程序,发现“for”占用了大量的内存。
例如:
Line # Mem usage Increment Line Contents
================================================
52 @profile
53 11.691 MB 0.000 MB def test():
54 19.336 MB 7.645 MB a = ["1"] * (10 ** 6)
55 19.359 MB 0.023 MB print recipe.total_size(a, verbose=False)
56 82.016 MB 62.656 MB for i in a:
57 pass
print recipe.total_size(a,verbose = False):8000098字节
问题是如何释放62.656 MB内存。
P.S。
对不起,我知道我的英语不是很好。我很感激大家读这篇文章。:-)
答案 0 :(得分:0)
如果你绝对不顾一切地减少循环中的内存使用量,你可以这样做:
i = 0
while 1:
try:
a[i] #accessing an element here
i += 1
except IndexError:
break
记忆统计(如果准确的话):
12 9.215 MB 0.000 MB i = 0
13 9.215 MB 0.000 MB while 1:
14 60.484 MB 51.270 MB try:
15 60.484 MB 0.000 MB a[i]
16 60.484 MB 0.000 MB i += 1
17 60.484 MB 0.000 MB except IndexError:
18 60.484 MB 0.000 MB break
然而,这段代码看起来很丑陋,而且内存使用量的减少也很小。
答案 1 :(得分:0)
1)而不是list iterator
。您应该使用generator
。根据您的示例代码:
@profile
def test():
a = ("1" for i in range(10**6)) #this will return a generator, instead of a list.
for i in a:
pass
现在,如果您使用generator 'a'
中的for loop
,则不会占用太多内存。
2)如果您收到list
,请先将其转换为generator
。
@profile
def test():
a = ["1"] * (10**6) #getting list
g = (i for i in a) #converting list into a generator object
for i in g: #use generator object for iteration
pass
试试这个。如果有帮助你。