为什么pickle the unpickled cifar10数据集会给出不同的大小?

时间:2016-04-16 02:27:35

标签: python pickle

我解开cifar10 dataset并立即将其作为文件腌制。为什么我要获得不同大小的文件?

代码如下:

import cPickle as pk


def unpickle_data(filename, mode='rb'):
    with open(filename, mode) as pkfile:
        data = pk.load(pkfile)
    return data


def pickle_data(data, filename, mode='wb'):
    with open(filename, mode) as pkfile:
         pk.dump(data, pkfile)


def main():
     dict = unpickle_data('data_batch_1')
     keys = dict.viewkeys()
     print keys
     print len(dict['data'])
     pickle_data(dict, 'mydata')


if __name__ == '__main__':
     main()

我得到的文件几乎是原始文件的两倍。 enter image description here enter image description here

我已经对新文件进行了unpickled,并将数据与原始文件进行了比较。数据值和数据类型都是相同的。那是什么原因?

另外,我发现unpickle和pickle操作仅在cifar10数据集上生成不同的大小。

1 个答案:

答案 0 :(得分:1)

Pickle支持多种协议。来自the documentation

  

目前有5种不同的协议可供使用   酸洗。协议使用的越高,版本越新   Python需要阅读所产生的泡菜。

     
      
  • 协议版本0是原始的“人类可读”协议,并且向后兼容早期版本的Python。
  •   
  • 协议版本1是一种旧的二进制格式,它也与早期版本的Python兼容。
  •   
  • 在Python 2.3中引入了协议版本2。它提供了更有效的新式类型的酸洗。请参阅PEP 307了解   有关协议2带来的改进的信息。
  •   
  • 在Python 3.0中添加了协议版本3。它具有对字节对象的显式支持,并且不能被Python 2.x打开。这个   是默认协议,以及推荐的协议时   需要与其他Python 3版本兼容。
  •   
  • 在Python 3.4中添加了协议版本4。它增加了对非常大的对象的支持,腌制更多种类的对象和一些数据   格式优化。有关的信息,请参阅PEP 3154   协议4带来的改进。
  •   

我怀疑你的原始文件是用其他东西腌制的 版本0,当你保存它时,你使用了默认值。