Ich habe ein Problem in Bezug auf eine Python einfache verknüpfte Liste und deren Speicherverbrauch.Schlechte Speicherzuweisung in Python LinkedList
Dies ist der Code:
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"
Mein Problem ist folgendes: dieses Skript ausgeführt wird verbraucht 1,7 GB meiner RAM.
Ausgang ist:
elem.size = 12
next.size = 8
size of r: 40000028
size of r[n-1]: 12
so, lassen Sie uns einige schnelle Mathematik tun:
10 Millionen Datensatz.
Jeder Datensatz bekam 12 Byte (Elem) + 8 Bytes (Zeiger auf nächste) = 20 Bytes
20 Bytes * 10 Millionen = 200.000.000 Bytes = 190,7 MB
Auch wenn ich muss die von der range() -Funktion zugewiesene Liste (ca. 30 MB) berücksichtigen, wie kann ich diese riesige Lücke des Speicherverbrauchs bewältigen? Habe ich in diesem Code einen dummen Fehler gemacht? Ich hoffe, die Antwort wird mich beschämen und entschuldigen, dass ich sie gefragt habe, aber ich weiß nur, was passiert ist!
Vielen Dank im Voraus für Ihre Hilfe.
Nicht, dass es die große Lücke ausmacht, aber Sie sollten die '' '' '' '' 'Methode von' 'Record''' ändern und es' '' sys.sizeof (self) '' 'stattdessen drucken lassen der zwei Komponentenelemente. Es ist 32 Bytes, nicht 20, weil in der Klassenstruktur Overhead ist. –
Fragmentierung wird etwas hinzufügen, denke ich. Ich würde versuchen, etwas wie 'repool = [None] * 10000000; ... rec = recpool [j]; j + = 1' und sehen was passiert. Versuchen Sie auch – Elazar
'gc.disable()'. – Elazar