Python LinkedList中的内存分配错误

关于Python简单链表及其内存消耗,我遇到了一些问题。


这是代码:


import sys


class Record:

    def __init__(self,elem):

        self.elem=elem

        self.next=None


    def size(self):

        print 'elem.size = ', sys.getsizeof(self.elem)

        print 'next.size = ', sys.getsizeof(self.next)



class LinkedList:

    def __init__(self):

        self.first=None

        self.last=None


    def addAsLast(self,elem):

        rec=Record(elem)

        if self.first==None:

            self.first=self.last=rec

        else:

            self.last.next=rec

            self.last=rec


if __name__=="__main__":

    l=LinkedList()

    r = Record(1)

    r.size()


    maxx = 10000000

    r = range(1, maxx)

    print 'size of r: ', sys.getsizeof(r)

    print 'size of r[n-1]: ', sys.getsizeof(r[maxx-2])


    for i in r:

        if(i% (maxx/10) == 0): print '.'

        l.addAsLast(i)

    print "The End"

我的问题是:运行此脚本消耗1.7 GB的RAM。


输出为:


elem.size =  12 

next.size =  8 

size of r:  40000028

size of r[n-1]:  12

因此,让我们做一些快速的数学运算:


1000万条记录。


每条记录有12个字节(元素)+ 8个字节(指向下一个的指针)= 20个字节


20字节* 1000万= 200.000.000字节= 190.7 MB


即使我必须考虑由range()函数分配的列表(大约30 MB),如何管理巨大的内存消耗缺口?我在这段代码中犯了一些愚蠢的错误吗?我希望这个答案会让我感到and愧和遗憾,但是,据我所知,我只是想知道发生了什么!


牧羊人nacy
浏览 229回答 2
2回答

一只甜甜圈

更改了打印输出,如下所示:class Record:    def __init__(self,elem):        self.elem=elem        self.next=None    def size(self):        print 'Record size = ', sys.getsizeof(self)        print 'elem.size = ', sys.getsizeof(self.elem)        print 'next.size = ', sys.getsizeof(self.next)输出 :Record size =  72elem.size =  24next.size =  16因此,我的每个链表节点均为72字节x 10M,应为720MB,.72GB我运行该程序,并使用top看到内存开销为3.6G。我的elem大小是您的两倍,而我注意到消耗的总内存是您的两倍(3.6G,而1.7G)。这一定是由于额外的python内存开销,例如垃圾回收。

当年话下

>>> class Record:...     def __init__(self, elem):...             self.elem = elem...             self.next = None   ... >>> r = Record(1)>>> sys.getsizeof(r)72还是我错过了什么?另外,在我的系统上:>>> sys.getsizeof(1)24>>> sys.getsizeof(None)16
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python