【已解决】Python Pickle报错:OSError: [Errno 22] Invalid argument

问题描述

在Python代码中使用Pickle模块dump一个对象,报错:

>>> with open(path, 'wb') as f:
>>>    pickle.dump(self, f)

Traceback (most recent call last):
  File "", line 1, in <module>
OSError: [Errno 22] Invalid argument

相关环境参数:

  • 操作系统:macOS 10.13.4
  • Python版本:Python 3.6.3

解决方案

出现该问题的原因是Pickle的对象太大,超过了2G,在OSX系统中无法直接dump,需要借助bytearray进行文件写入,如下所示:

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])
        

参考资料

https://stackoverflow.com/questions/31468117/python-3-can-pickle-handle-byte-objects-larger-than-4gb
https://bugs.python.org/issue24658
https://docs.python.org/3/library/pickle.html


以上就是本文的全部内容,如果您喜欢这篇文章,欢迎将它分享给朋友们。

感谢您的阅读,祝您生活愉快!

作者:小美哥
2019-01-12

你可能感兴趣的:(Python)