У меня есть проблема с простым связанным списком Python и его потреблением памяти.Плохое выделение памяти в Python LinkedList
Это код:
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 Гб оперативной памяти моей.
Выход:
elem.size = 12
next.size = 8
size of r: 40000028
size of r[n-1]: 12
так, давайте делать некоторые быстрые математику:
10 миллионов Record.
Каждая запись получил 12 байт (элем) + 8 байт (указатель на следующий) = 20 байт
20 байт * 10 миллионов = 200.000.000 байт = 190,7 MB
Даже если я должен учитывать список, выделенный функцией range() (около 30 МБ), как я могу управлять этим огромным разрывом в потреблении памяти? Я сделал какую-то глупую ошибку в этом коде? Я надеюсь, что ответ заставит меня почувствовать стыд и жаль, что я спросил его, но, чтобы понять, мне просто интересно, что происходит!
Заранее за вашу помощь.
Не то, чтобы он составлял большой пробел, но вы должны изменить '' '' '' '' метод '' 'Record''' и заставить его печатать' '' sys.sizeof (self) '' 'вместо двух компонентных элементов. Это 32 байта, а не 20, потому что в структуре класса есть накладные расходы. –
фрагментация добавит что-то, я думаю. Я бы попробовал что-то вроде 'recpool = [None] * 10000000; ... rec = recpool [j]; j + = 1' и посмотреть, что произойдет. – Elazar
, попробуйте 'gc.disable()'. – Elazar