查看.pkl文件的数据结构

时间:2019-06-12 03:41:35

标签: python

我尝试通过代码查看ExtremeNet_250000.pkl(大小约780M)的数据结构:

import pickle
pth=open(r'E:/ExtremeNet_250000.pkl','rb')
pkl=pickle.load(pth)
print(pkl)

但是它返回int就像

RESTART: C:/Users/cwc888888/AppData/Local/Programs/Python/Python37/111.py =
119547037146038801333356

你能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

针对您的具体情况:

根据您的文件名,我猜您正在玩the ExtremeNet demo project。跟踪代码和依赖关系,看起来该缓存文件是来自torch.save包的PyTorch调用的结果。对于这种情况,最简单的解决方案可能就是安装PyTorchuse torch.load to load it


一般解决方案:

可以以非结构化方式将多个腌制对象保存在文件中。也就是说,不是将list另存为list,而是使用一个:

 with open(filename, 'wb') as f:
     pickle.dump(mylist, f)

创建者可以使用以下方法逐个转储单个值:

 with open(filename, 'wb') as f:
     for x in mylist:
         pickle.dump(x, f)
     # Or equivalently and usually slightly faster creating a single reusable Pickler:
     pickler = pickle.Pickler(f)
     for x in mylist:
         pickler.dump(x)

从输出中删除list结构。

如果有这样的文件,则必须以类似的方式读出值。最简单的方法是制作一个生成器函数,该函数将在迭代时产生连续的值,例如:

def iterunpickle(f):
    unpickler = pickle.Unpickler(f)
    try:
        while True:
            yield unpickler.load()
    except EOFError:
        pass

允许您使用以下方法迭代文件的内容:

with open(r'E:/ExtremeNet_250000.pkl','rb') as pth:
    for item in iterunpickle(pth):
        print(item)

或使用以下方法将整个内容加载到list中(如果有足够的可用内存):

with open(r'E:/ExtremeNet_250000.pkl','rb') as pth:
    items = list(iterunpickle(pth))

对于这么大的文件,我建议实时迭代以保留内存,而不要预先转换为list;如果仅是第一个值范围内的较大整数,则将整个内容加载到列表中的内存成本大约是磁盘大小的三倍,具体取决于pickle协议,解释器是32位还是64位等。无论如何,在您对数据进行任何处理之前,您一直在为数据寻找GB的RAM。