我正在運行創建大對象的代碼,其中包含多個用戶定義的類,然後我必須序列化以備將來使用。從我所知道的情況來看,只有酸洗對於我的要求來說足夠多才多藝。我一直在使用cPickle來存儲它們,但它生成的對象大小約爲40G,這些代碼來自運行在500 MB內存中的代碼。序列化的速度不是問題,但對象的大小是。是否有任何提示或替代過程可以用來使醬菜變小?減小cPickle對象的大小
回答
爲你工作,你總是可以通過bzip2
管鹹菜。唯一的問題是,bzip2
有點slowish ...... gzip
應該更快,但文件大小几乎是2倍大:
In [1]: class Test(object):
def __init__(self):
self.x = 3841984789317471348934788731984731749374
self.y = 'kdjsaflkjda;sjfkdjsf;klsdjakfjdafjdskfl;adsjfl;dasjf;ljfdlf'
l = [Test() for i in range(1000000)]
In [2]: import cPickle as pickle
with open('test.pickle', 'wb') as f:
pickle.dump(l, f)
!ls -lh test.pickle
-rw-r--r-- 1 viktor staff 88M Aug 27 22:45 test.pickle
In [3]: import bz2
import cPickle as pickle
with bz2.BZ2File('test.pbz2', 'w') as f:
pickle.dump(l, f)
!ls -lh test.pbz2
-rw-r--r-- 1 viktor staff 2.3M Aug 27 22:47 test.pbz2
In [4]: import gzip
import cPickle as pickle
with gzip.GzipFile('test.pgz', 'w') as f:
pickle.dump(l, f)
!ls -lh test.pgz
-rw-r--r-- 1 viktor staff 4.8M Aug 27 22:51 test.pgz
所以我們看到,bzip2
的文件大小几乎是40倍小, gzip
比其小20倍。 gzip與原始cPickle的性能非常接近,如您所見:
cPickle : best of 3: 18.9 s per loop
bzip2 : best of 3: 54.6 s per loop
gzip : best of 3: 24.4 s per loop
你沒有考慮到lzma,我發現它是一個非常好的算法。當我用lzma壓縮200000個隨機數的醃製列表時,它被毆打gzip和bzip2(至少在sizewise方面,我沒有檢查速度) –
@Viktor有沒有比cpickle更快的序列化? (你寫「沒有其他方法適合你」) – DreamFlasher
@DreamFlasher還有其他更簡單的序列化模塊,比如msgpack,json ...但是它們不會序列化複雜的python對象,只是基本的類型。 –
您可以使用zip文件結合您的cPickle dump
電話:
import cPickle
import gzip
def save_zipped_pickle(obj, filename, protocol=-1):
with gzip.open(filename, 'wb') as f:
cPickle.dump(obj, f, protocol)
,並重新加載一個壓縮的醃製對象:如果必須使用泡菜和系列化的沒有其他方法
def load_zipped_pickle(filename):
with gzip.open(filename, 'rb') as f:
loaded_object = cPickle.load(f)
return loaded_object
- 1. Java減小對象的大小
- 2. 減少緩衝區對象大小
- 3. 減小默認石英/繪圖對象的大小
- 4. 減小EditField的大小
- 5. SQL中減小的行大小並沒有減小表的大小
- 6. HTML - 減小頁面大小
- 7. 減小函數大小
- 8. Bootstrap減小字體大小
- 9. Java'Date'對象大小
- 10. Fabric.js對象大小
- 11. JavaScript - 對象大小
- 12. Android/Dalvik中最小的對象大小
- 13. Go中對象的大小
- 14. java.awt.Color對象的大小
- 15. 獲取對象的大小
- 16. Java對象的大小
- 17. String對象的大小知
- 18. 對象的大小序列
- 19. Oracle Coherence的對象大小
- 20. 的java對象大小
- 21. 減小igraph中的自環的大小
- 22. 減少TimePicker大小
- 23. 減少BitmapDrawable大小
- 24. 在tableview中減小部分的大小
- 25. 如何減小SHA1的大小?
- 26. 減小WPF中XPS的大小
- 27. 如何減小表單行的大小?
- 28. 如何減小按鈕的大小?
- 29. 減小.svn文件夾的大小
- 30. pyspark:減小JSON變量的大小
您使用的是什麼pickle協議? – user2357112
協議版本0. 2會產生實質性差異嗎? – ddn
它應該有所作爲。不過,我不確定這是多少。 – user2357112