Ho qualche problema riguardante una semplice lista collegata a Python e il suo consumo di memoria.Allocazione di memoria errata in Python LinkedList
Questo è il codice:
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"
mio problema è questo: l'esecuzione di questo script consuma 1,7 GB di RAM mia.
uscita è:
elem.size = 12
next.size = 8
size of r: 40000028
size of r[n-1]: 12
così, cerchiamo di fare qualche rapido calcolo:
10 milioni di record.
ogni record ottenuto 12 byte (elem) + 8 byte (puntatore successivo) = 20 byte
20 byte * 10 milioni = 200.000.000 byte = 190.7 MB
Anche se io deve considerare l'elenco assegnato dalla funzione range() (circa 30 MB) come posso gestire quell'enorme perdita di memoria? Ho fatto qualche stupido errore in questo codice? Spero che la risposta mi faccia vergognare e dispiacere di averlo chiesto ma, fino a sapere, mi sto solo chiedendo cosa sta succedendo!
Grazie in anticipo per il vostro aiuto.
Non che crei il grande spazio, ma dovresti modificare il metodo '' 'size''' di' '' Record''' e farlo stampare '' 'sys.sizeof (self)' '' dei due elementi componenti. È 32 byte, non 20 perché c'è un sovraccarico nella struttura della classe. La frammentazione –
aggiungerà qualcosa, immagino. Vorrei provare qualcosa come 'recpool = [Nessuno] * 10000000; ... rec = recpool [j]; j + = 1' e vedi cosa succede. – Elazar
, prova anche 'gc.disable()'. – Elazar