我尝试通过代码查看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
你能给我一些建议吗?
答案 0 :(得分:0)
针对您的具体情况:
根据您的文件名,我猜您正在玩the ExtremeNet
demo project。跟踪代码和依赖关系,看起来该缓存文件是来自torch.save
包的PyTorch
调用的结果。对于这种情况,最简单的解决方案可能就是安装PyTorch
和use 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。