【问题标题】:Unpickling large objects stored on network drives取消存储在网络驱动器上的大型对象
【发布时间】:2012-05-11 18:52:19
【问题描述】:

我有大型 (~75MB) 腌制对象可在映射的网络驱动器上使用(例如:X:/folder1/large_pickled_item.pk) 对象包含 numpy 数组+python 列表,并使用 cPickle 进行腌制,协议 2

当我尝试解开数据时,我收到以下错误消息:

使用泡菜: KeyError:(随机字符)

使用 cPickle: IOError: [Errno 22] 参数无效

如果腌制的物体尺寸较小,我不会出错, 或者如果我将(较大的)对象复制到本地驱动器并运行相同的脚本。

知道问题出在哪里吗?是python+pickle问题还是windows共享问题?

注意事项:

  1. 我在 Windows XP Professional (SP3) 上使用 Python 2.7.2
  2. 我无法控制对象格式,我不创建它们,我只能读取它们
  3. 示例堆栈跟踪:

    文件“test.py”,第 38 行,在 getObject 中 obj = pickle.load(输入) 文件“C:\software\python\lib\pickle.py”,第 1378 行,加载中 返回 Unpickler(file).load() 文件“C:\software\python\lib\pickle.py”,第 858 行,加载中 调度键 KeyError: '~'

解决方案

  1. 将文件以 67076095 字节的块读取到字符串缓冲区中。
  2. 使用字符串缓冲区调用pickle.loads,而不是使用文件对象调用pickle.load

【问题讨论】:

  • 这可能和stackoverflow.com/questions/4226941/…是同一个问题
  • 您所指的问题确实类似,但并没有解决我的问题:解决方案是使用 w+b 选项打开文件进行写入,与读取类似的技巧没有工作

标签: python windows pickle


【解决方案1】:

这是由于Windows bug 导致无法以大于 64MB 的块读取和写入网络文件。

我建议尝试https://stackoverflow.com/a/4228291/367273中提出的解决方法的镜像

如果这没有帮助,也许您可​​以为文件对象创建一个包装器,该包装器会自动将每个大型 read() 拆分为多个较小的读取,并将该包装器呈现给 pickle 模块?

【讨论】:

  • 感谢您的回答,我已经尝试了镜像解决方法:使用 r+b 打开文件不起作用。我可以尝试另一个技巧,但我不确定 pickle 是否只能处理对象的一部分
  • @Dhara:我的意思是,当要求读取时,比如说,64MB,它会得到两个 32MB 的块,合并它们,然后将结果返回到 pickle 模块。这将回避 64MB 的 Windows 限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
相关资源
最近更新 更多