Python 3 - pickle 可以处理大于 4GB 的字节对象吗?

2024-01-18

基于此comment https://stackoverflow.com/a/29704623/1202808以及参考文档,来自 Python 3.4+ 的 Pickle 4.0+ 应该能够 pickle 大于 4 GB 的字节对象。

但是,在 Mac OS X 10.10.4 上使用 python 3.4.3 或 python 3.5.0b2 时,当我尝试 pickle 大字节数组时出现错误:

>>> import pickle
>>> x = bytearray(8 * 1000 * 1000 * 1000)
>>> fp = open("x.dat", "wb")
>>> pickle.dump(x, fp, protocol = 4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

我的代码中是否存在错误或者我误解了文档?


这是一个简单的解决方法问题 24658 https://bugs.python.org/issue24658. Use pickle.loads or pickle.dumps并将字节对象分成大小块2**31 - 1将其放入或取出文件。

import pickle
import os.path

file_path = "pkl.pkl"
n_bytes = 2**31
max_bytes = 2**31 - 1
data = bytearray(n_bytes)

## write
bytes_out = pickle.dumps(data)
with open(file_path, 'wb') as f_out:
    for idx in range(0, len(bytes_out), max_bytes):
        f_out.write(bytes_out[idx:idx+max_bytes])

## read
bytes_in = bytearray(0)
input_size = os.path.getsize(file_path)
with open(file_path, 'rb') as f_in:
    for _ in range(0, input_size, max_bytes):
        bytes_in += f_in.read(max_bytes)
data2 = pickle.loads(bytes_in)

assert(data == data2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 - pickle 可以处理大于 4GB 的字节对象吗? 的相关文章

随机推荐