程序執(zhí)行過(guò)程中,如果RAM中有大量的對(duì)象在運(yùn)行,就可能會(huì)出現(xiàn)內(nèi)存問(wèn)題,特別是在對(duì)可用內(nèi)存總量有限的情況下。
下面是一些減少字典對(duì)象內(nèi)存大小的方法,這些方法可以顯著減少對(duì)象所需的RAM大小。
字典
在Python里用字典來(lái)表示結(jié)構(gòu)信息是非常方便的:
>>> ob ={'x':1,'y':2,'z':3}
>>> x = ob['x']
>>> ob['y']= y
但我們來(lái)看看它的內(nèi)存消耗:
>>>print(sys.getsizeof(ob))
240
這個(gè)數(shù)額看起來(lái)好像挺小,但是當(dāng)你想要?jiǎng)?chuàng)造許多這樣的變量時(shí)就積少成多了:
對(duì)象數(shù)目 | 內(nèi)存大小 |
---|---|
1 000 000 | 240 Mb |
10 000 000 | 2.40 Gb |
100 000 000 | 24 Gb |
解決方案
用類(lèi)實(shí)例來(lái)代替字典:
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
類(lèi)實(shí)例各個(gè)部分的內(nèi)存大小:
Field | Size (bytes) |
---|---|
PyGC_Head | 24 |
PyObject_HEAD | 16 |
weakref | 8 |
dict | 8 |
TOTAL: | 56 |
如果你不是很了解類(lèi)和實(shí)例,可以看廖雪峰的這篇文章:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017496031185408
這里的__weakref__是對(duì)這個(gè)對(duì)象的弱引用列表的引用,而__dict__是對(duì)類(lèi)實(shí)例字典的引用,它包含實(shí)例屬性的值。從Python 3.3開(kāi)始, 類(lèi)的所有實(shí)例用共享空間存儲(chǔ)字典的keys. 這減少了內(nèi)存中實(shí)例的大小:
>>>print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__))
56 112
56+112=168 < 240. 因此,大量的類(lèi)實(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__的類(lèi)實(shí)例
通過(guò)消除__dict__和weakref__,可以顯著減少RAM中的類(lèi)實(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中的對(duì)象明顯變小:
Field | Size (bytes) |
---|---|
PyGC_Head | 24 |
PyObject_HEAD | 16 |
x | 8 |
y | 8 |
z | 8 |
TOTAL: | 64 |
今日重點(diǎn):在類(lèi)定義中使用__slots__會(huì)顯著減少大量實(shí)例的內(nèi)存占用
實(shí)例數(shù)目 | 大小 |
---|---|
1 000 000 | 64 Mb |
10 000 000 | 640 Mb |
100 000 000 | 6.4 Gb |
目前,這是大幅度減少RAM中類(lèi)實(shí)例的內(nèi)存占用的主要方法。相比于單純用字典,減少了(240-64)/240= 73% 的內(nèi)存占用。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3108瀏覽量
74986 -
字典
+關(guān)注
關(guān)注
0文章
13瀏覽量
7766 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86176 -
儲(chǔ)存
+關(guān)注
關(guān)注
3文章
202瀏覽量
22640
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)問(wèn)Nuclei Studio IDE怎么查看程序所用內(nèi)存大小?
STM32F103xx系列內(nèi)存大小
python字典
HarmonyOS如何獲取系統(tǒng)內(nèi)存大小和可用內(nèi)存?
python合并字典的 7 種方法
python中的字典(dict)對(duì)象以及其使用方法
電腦內(nèi)存大小怎么查看
python字典是什么
python實(shí)現(xiàn)合并字典的方法
Python序列的字典類(lèi)型介紹

評(píng)論