Python的pickle以及其他的序列化
之前在論壇上看到說Python
記憶體佔用的問題,有個回覆說不少人還認為pickle是直接將記憶體中的資料到處到檔案裡了
,很羞愧,看到這句話之前,我也是這麼認為的……
這篇文章就是對這些進行簡單的摸底,做到心中有數,從這麼看來說,之前寫的部分程式碼坑不小……
一、python的字典記憶體佔用以及pickle輸出大小
import sys import pickle result = {} for i in range(1000000): result[str(i).encode('utf-8')] = str(i).encode('utf-8') print(sys.getsizeof(result)) with open('test.pk', 'wb') as f: pickle.dump(result, f)
在我本機windows10 python 3.7
,記憶體中:41943144,匯出後的pickle檔案大小為25778963
記憶體多了62%
這是str:str
int:int
41943144: 9739352,大概膨脹了4倍多
key範圍擴大到 40000000後,記憶體佔用為2525MB
二、golang記憶體佔用
1-n的key範圍記憶體
100000081MB
2000000162MB
3000000168MB
4000000320MB
5000000330MB
10000000650MB
200000001281MB
400000002540MB
在map
中,平均每增加一個int:int
key,記憶體增加66byte
將int
更換為int32 int32
再嘗試
400000001417MB 降低還是很明顯
程式碼如下
package main import ( "fmt" "unsafe" ) func int2int() map[int32]int32 { var res = make(map[int32]int32) var i int32 for i = 0; i < 40000000; i++ { res[i] = i } return res } func main() { i2i := int2int() var aa int32 fmt.Println(unsafe.Sizeof(aa)) fmt.Println(len(i2i)) fmt.Scanln() }
小結
這只是簡單的對比,沒有說哪個優秀之類的,並且這個對比如果硬要對比的話肯定有不少地方不公平,但是單單對map int:int
這種型別來說,python
跟golang
的記憶體佔用差距比我想象中的要小
todo
go
中類似python
的pickle
的是encoding/gob
?有空補上對比