程序執(zhí)行過程中,如果RAM中有大量的對象在運(yùn)行,就可能會(huì)出現(xiàn)內(nèi)存問題,特別是在對可用內(nèi)存總量有限的情況下。
下面是一些減少字典對象內(nèi)存大小的方法,這些方法可以顯著減少對象所需的RAM大小。
字典
在Python里用字典來表示結(jié)構(gòu)信息是非常方便的:
>>> ob ={'x':1,'y':2,'z':3}
>>> x = ob['x']
>>> ob['y']= y
但我們來看看它的內(nèi)存消耗:
>>>print(sys.getsizeof(ob))
240
這個(gè)數(shù)額看起來好像挺小,但是當(dāng)你想要?jiǎng)?chuàng)造許多這樣的變量時(shí)就積少成多了:
對象數(shù)目 | 內(nèi)存大小 |
---|---|
1 000 000 | 240 Mb |
10 000 000 | 2.40 Gb |
100 000 000 | 24 Gb |
解決方案
用類實(shí)例來代替字典:
classPoint:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
>>> ob =Point(1,2,3)
>>> x = ob.x
>>> ob.y = y
類實(shí)例各個(gè)部分的內(nèi)存大小:
Field | Size (bytes) |
---|---|
PyGC_Head | 24 |
PyObject_HEAD | 16 |
weakref | 8 |
dict | 8 |
TOTAL: | 56 |
如果你不是很了解類和實(shí)例,可以看廖雪峰的這篇文章:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017496031185408
這里的__weakref__是對這個(gè)對象的弱引用列表的引用,而__dict__是對類實(shí)例字典的引用,它包含實(shí)例屬性的值。從Python 3.3開始, 類的所有實(shí)例用共享空間存儲(chǔ)字典的keys. 這減少了內(nèi)存中實(shí)例的大小:
>>>print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__))
56 112
56+112=168 < 240. 因此,大量的類實(shí)例占用的內(nèi)存比普通字典(dict)要少:
實(shí)例數(shù)目 | 大小 |
---|---|
1 000 000 | 168 Mb |
10 000 000 | 1.68 Gb |
100 000 000 | 16.8 Gb |
字典占實(shí)例大小的百分比為112/168=67%, 我們還是可以看出,實(shí)例中字典的大小嚴(yán)重影響了RAM中實(shí)例的大小。下面有更好的方法。
帶__slots__的類實(shí)例
通過消除__dict__和weakref__,可以顯著減少RAM中的類實(shí)例的大小。用__slots__是有可能做到的:
classPoint:
__slots__ ='x','y','z'
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
>>> ob =Point(1,2,3)
>>>print(sys.getsizeof(ob))
64
RAM中的對象明顯變小:
Field | Size (bytes) |
---|---|
PyGC_Head | 24 |
PyObject_HEAD | 16 |
x | 8 |
y | 8 |
z | 8 |
TOTAL: | 64 |
今日重點(diǎn):在類定義中使用__slots__會(huì)顯著減少大量實(shí)例的內(nèi)存占用
實(shí)例數(shù)目 | 大小 |
---|---|
1 000 000 | 64 Mb |
10 000 000 | 640 Mb |
100 000 000 | 6.4 Gb |
目前,這是大幅度減少RAM中類實(shí)例的內(nèi)存占用的主要方法。相比于單純用字典,減少了(240-64)/240= 73% 的內(nèi)存占用。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3055瀏覽量
74327 -
字典
+關(guān)注
關(guān)注
0文章
13瀏覽量
7724 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85037 -
儲(chǔ)存
+關(guān)注
關(guān)注
3文章
201瀏覽量
22439
發(fā)布評論請先 登錄
相關(guān)推薦
評論