为了账号安全,请及时绑定邮箱和手机立即绑定

Python LinkedList中的内存分配错误

Python LinkedList中的内存分配错误

牧羊人nacy 2021-03-22 13:14:46
关于Python简单链表及其内存消耗,我遇到了一些问题。这是代码:import sysclass 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=recif __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:  40000028size of r[n-1]:  12因此,让我们做一些快速的数学运算:1000万条记录。每条记录有12个字节(元素)+ 8个字节(指向下一个的指针)= 20个字节20字节* 1000万= 200.000.000字节= 190.7 MB即使我必须考虑由range()函数分配的列表(大约30 MB),如何管理巨大的内存消耗缺口?我在这段代码中犯了一些愚蠢的错误吗?我希望这个答案会让我感到and愧和遗憾,但是,据我所知,我只是想知道发生了什么!
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

更改了打印输出,如下所示:


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 =  72

elem.size =  24

next.size =  16

因此,我的每个链表节点均为72字节x 10M,应为720MB,.72GB


我运行该程序,并使用top看到内存开销为3.6G。我的elem大小是您的两倍,而我注意到消耗的总内存是您的两倍(3.6G,而1.7G)。


这一定是由于额外的python内存开销,例如垃圾回收。


查看完整回答
反对 回复 2021-03-30
?
当年话下

TA贡献1890条经验 获得超9个赞

>>> 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


查看完整回答
反对 回复 2021-03-30
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信