如何分块加载 Pickle 文件?
Posted
技术标签:
【中文标题】如何分块加载 Pickle 文件?【英文标题】:How to load Pickle file in chunks? 【发布时间】:2020-05-15 21:28:00 【问题描述】:有没有分块加载pickle文件的选项?
我知道我们可以将数据保存为 CSV 并分块加载。 但除了 CSV 之外,还有什么选项可以分块加载 pickle 文件或任何 python 本机文件?
【问题讨论】:
你是一个腌制的人,还是只是给了一个垃圾场?如果您要进行酸洗,请给出一个简短的数据示例以及如何酸洗它。 您好!您不能按块读取泡菜文件,但可以使用hdf 格式。 【参考方案1】:基于the documentation for Python pickle,目前不支持分块。
但是,可以将数据拆分为块,然后以块的形式读取。例如,假设原来的结构是
import pickle
filename = "myfile.pkl"
str_to_save = "myname"
with open(filename,'wb') as file_handle:
pickle.dump(str_to_save, file_handle)
with open(filename,'rb') as file_handle:
result = pickle.load(file_handle)
print(result)
这可以分成两个单独的泡菜文件:
import pickle
filename_1 = "myfile_1.pkl"
filename_2 = "myfile_2.pkl"
str_to_save = "myname"
with open(filename_1,'wb') as file_handle:
pickle.dump(str_to_save[0:4], file_handle)
with open(filename_2,'wb') as file_handle:
pickle.dump(str_to_save[4:], file_handle)
with open(filename_1,'rb') as file_handle:
result = pickle.load(file_handle)
print(result)
根据 AKX 的评论,将多个数据写入单个文件也可以:
import pickle
filename = "myfile.pkl"
str_to_save = "myname"
with open(filename,'wb') as file_handle:
pickle.dump(str_to_save[0:4], file_handle)
pickle.dump(str_to_save[4:], file_handle)
with open(filename,'rb') as file_handle:
result = pickle.load(file_handle)
print(result)
result = pickle.load(file_handle)
print(result)
【讨论】:
Pickle 对象可以连接到单个文件中(并按原样读取)。也就是说,您可以多次pickle.dump()
进入同一个文件。
酷,我没想到。我添加了一个新的 sn-p 并引用了您的评论。【参考方案2】:
我有一个类似的问题,我写了一个桶文件描述符池,并注意到当我关闭一个文件描述符时我的泡菜文件正在损坏。尽管您可以对打开的文件描述符执行多个 dump()
操作,但随后无法执行 open('file', 'ab')
来开始保存一组新对象。
在我不得不关闭文件描述符之前,我通过将pickler.dump(None)
作为会话终止符解决了这个问题,并且在重新打开时,我实例化了一个新的Pickler
实例以继续写入文件。
从该文件加载时,None
对象表示会话结束,此时我使用文件描述符实例化了一个新的Pickler
实例,以继续读取多会话 pickle 文件的其余部分。
这仅适用于由于某种原因必须关闭文件描述符的情况。否则,以后可以为load()
执行任意数量的dump()
调用。
【讨论】:
以上是关于如何分块加载 Pickle 文件?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas将dataframe保存为pickle文件并加载保存后的pickle文件查看dataframe数据实战