如何分块加载 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

Python 处理大文件并用pickle保存

如何将大文件加载到分块的 Adonis JS 中?

Pandas将dataframe保存为pickle文件并加载保存后的pickle文件查看dataframe数据实战

无法使用 pickle 和多个模块加载文件

在非 GPU 机器上使用 pickle 加载 .txt 文件

机器学习之保存与加载.pickle模型文件