取消存储在网络驱动器上的大型对象

时间:2012-05-02 09:49:30

标签: python windows pickle

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

进行pickle

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

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

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

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

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

注意:

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

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

  4. 解决方案

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

1 个答案:

答案 0 :(得分:1)

这是由于Windows bug,因此以大于64MB的块读取和写入网络文件不起作用。

我建议尝试https://stackoverflow.com/a/4228291/367273

中提供的变通方法的镜像

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