如何减少在 python 中加载泡菜文件或将泡菜文件映射到磁盘的时间

Posted

技术标签:

【中文标题】如何减少在 python 中加载泡菜文件或将泡菜文件映射到磁盘的时间【英文标题】:How to reduce time to load a pickle file in python or map a pickle file to disk 【发布时间】:2021-05-12 19:17:42 【问题描述】:

我想加载大小为 4.23GB 的泡菜文件。 我使用下面的代码来加载数据:

import _pickle as cPickle
def read_pickle(file):
    try:
        with open(file, "rb") as input_file:
            data = cPickle.load(input_file)
            return data
    except Exception as e:
        print("Error in reading data from pickle file",e)

系统配置:16 核 32GB RAM

输出:

%time data=read_pickle(file)

CPU times: user 5.79 s, sys: 1.21 s, total: 7 s
Wall time: 7 s

由于多个用户在代码中使用它,所以我想在我的代码中加载这个文件一次,并每次都使用它的返回数据无论如何都要将此文件映射到磁盘以避免每次加载文件或减少加载时间.

【问题讨论】:

你试过从 hdf5 存储和读取它可能比 pickle 更快。 ***.com/questions/37928794/… 是的,我尝试使用 hdf5,但从 cPickle 加载和存储数据比 hdf5 快得多 【参考方案1】:

文件中存储了哪些类型的数据? 如果它只包含数据,我建议寻找替代方案。 如果它包含实例或其他数据,请尝试更改 dunder 方法 getstatesetstate 以避免存储无用数据,如原始数据、临时数据结构等。

【讨论】:

我存储了字典类数据。 如果它们是数字数据,您可以尝试使用 numpy 结构。 numpy 的二进制格式非常快。另一方面,ujson 格式可以很好地处理基本数据类型【参考方案2】:

7 秒是将 4 GB 文件读回 RAM 并重新创建现有结构的合适时间。

对于有关为多个用户提供服务的查询,您可能希望查看 Redis(或任何其他内存中键值数据结构服务器)来保存数据并从那里为用户提供服务,而不是为每个用户从 pickle 文件重新创建.

【讨论】:

以上是关于如何减少在 python 中加载泡菜文件或将泡菜文件映射到磁盘的时间的主要内容,如果未能解决你的问题,请参考以下文章

查找泡菜文件python的字节大小[重复]

python的泡菜

python luigi localTarget 泡菜

scikit-learn ExtraTreesClassifier - 为啥泡菜文件这么大? (几 GB)

如何将列表保存到临时目录中的泡菜文件并将该文件传递给函数?

Python泡菜错误:UnicodeDecodeError