[英]_pickle in python3 doesn't work for large data saving
我正在嘗試應用_pickle
將數據保存到磁盤上。 但是當調用_pickle.dump
,我收到了一個錯誤
OverflowError: cannot serialize a bytes object larger than 4 GiB
這是使用_pickle
一個嚴格限制嗎? ( cPickle
for python2)
在Python 3.4中不再有PEP 3154和Pickle 4.0
https://www.python.org/dev/peps/pep-3154/
但是你需要說你想使用協議的第4版:
https://docs.python.org/3/library/pickle.html
pickle.dump(d, open("file", 'w'), protocol=4)
是的,這是一個硬編碼限制; 來自save_bytes
函數 :
else if (size <= 0xffffffffL) {
// ...
}
else {
PyErr_SetString(PyExc_OverflowError,
"cannot serialize a bytes object larger than 4 GiB");
return -1; /* string too large */
}
該協議使用4個字節將對象的大小寫入磁盤,這意味着您只能跟蹤最多2 32 == 4GB的大小。
如果你可以將bytes
對象分解為多個對象,每個對象小於4GB,你當然可以將數據保存到pickle中。
上面有一個很好的答案,為什么泡菜不起作用。 但它仍然不適用於Python 2.7,如果你仍然在Python 2.7並希望支持大文件,尤其是NumPy(Gum上的NumPy陣列失敗),這是一個問題。
您可以使用OC序列化,該序列化已更新為適用於4Gig上的數據。 有一個Python C擴展模塊可從以下位置獲得:
http://www.picklingtools.com/Downloads
看看文檔:
但是,這里有一個簡短的總結:有ocdumps和ocloads,非常像pickle的轉儲和負載::
from pyocser import ocdumps, ocloads
ser = ocdumps(pyobject) : Serialize pyobject into string ser
pyobject = ocloads(ser) : Deserialize from string ser into pyobject
OC序列化速度提高了1.5-2倍,並且可以與C ++一起使用(如果你正在混合使用語言)。 它適用於所有內置類型,但不適用於類(部分原因是它是跨語言的,並且很難從Python構建C ++類)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.