我解开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()
我已经对新文件进行了unpickled,并将数据与原始文件进行了比较。数据值和数据类型都是相同的。那是什么原因?
另外,我发现unpickle和pickle操作仅在cifar10
数据集上生成不同的大小。
答案 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,当你保存它时,你使用了默认值。