Tôi có một số vấn đề liên quan đến một danh sách liên kết đơn giản Python và mức tiêu thụ bộ nhớ của nó.Phân bổ bộ nhớ kém trong Python LinkedList
Đây là mã:
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"
Vấn đề của tôi là thế này: chạy script này tiêu thụ 1,7 GB RAM tôi.
Output là:
elem.size = 12
next.size = 8
size of r: 40000028
size of r[n-1]: 12
như vậy, chúng ta hãy làm một số toán nhanh:
10 triệu Record.
Mỗi Ghi nhận 12 byte (elem) + 8 byte (con trỏ tới một kế tiếp) = 20 Bytes
20 byte * 10 triệu = 200.000.000 byte = 190,7 MB
Thậm chí nếu tôi phải xem xét danh sách được phân bổ bởi hàm range() (khoảng 30 MB) làm thế nào tôi có thể quản lý khoảng cách lớn về mức tiêu thụ bộ nhớ? Tôi đã thực hiện một số sai lầm ngu ngốc trong mã này? Tôi hy vọng câu trả lời sẽ khiến tôi cảm thấy xấu hổ và xin lỗi vì đã hỏi nó nhưng, tôi biết rằng, tôi đang tự hỏi điều gì đang xảy ra!
Cảm ơn trước sự giúp đỡ của bạn.
Không phải là nó tạo nên khoảng trống lớn, nhưng bạn nên thay đổi phương thức '' 'size''' của' '' Record''' và làm cho nó in '' 'sys.sizeof (self)' '' thay thế của hai thành phần thành phần. Đó là 32 byte, không phải 20, bởi vì có chi phí trong cấu trúc lớp. –
phân mảnh sẽ thêm một cái gì đó, tôi đoán. Tôi sẽ thử một cái gì đó như 'recpool = [None] * 10000000; ... rec = recpool [j]; j + = 1' và xem điều gì xảy ra. – Elazar
cũng, hãy thử 'gc.disable()'. – Elazar