3

我们的游戏程序会将所有玩家的数据初始化到内存中。我的目的是减少不必要的内存。我跟踪了程序,发现“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 bytes

问题是如何释放 62.656 MB 内存。

附言

对不起,我知道我的英语不是很好。我会感谢大家阅读这篇文章。:-)

4

2 回答 2

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

然而,这段代码看起来很丑陋,而且内存使用量的减少和危险也很小。

于 2013-08-07T10:27:54.983 回答
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

尝试这个。如果是帮助你。

于 2013-08-07T11:49:38.363 回答