簡體   English   中英

python3中的_pickle不適用於大數據保存

[英]_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

看看文檔:

http://www.picklingtools.com/html/faq.html#python-c-extension-modules-new-as-of-picklingtools-1-6-0-and-1-3-3

但是,這里有一個簡短的總結:有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM