高效加载 8gb 腌制文件



我使用以下代码挑选了 json/字典格式的数据:

with open('data.pkl', 'wb') as f:   
     pickle.dump(to_list, f)

生成的腌制对象为 8 GB!现在我正在尝试加载文件以进行一些数据操作/清理,但加载需要很长时间(~4 分钟(。我使用以下代码加载数据:

pickle_in = open("data.pkl","rb")   
data = pickle.load(pickle_in)

我想减少加载时间。

谁能帮我解决这个问题?

可能的解决方案是以另一种格式存储数据。请考虑以下代码。与泡菜存储的数据完全相同。唯一的区别是格式 - 列表字典VS熊猫数据帧。如您所见,自己尝试 panas 数据帧的加载速度提高了约 50 倍。我想原因是将数据解析为对象。因此,请考虑切换到更高效的数据格式。

import functools
import time
import pickle
import numpy as np
import pandas as pd

def measure_running_time(echo=True):
    def decorator(func):
        @functools.wraps(func)
        def wrapped(*args, **kwargs):
            t_1 = time.time()
            ans = func(*args, **kwargs)
            t_2 = time.time()
            if echo:
                print(f'{func.__name__}() running time is {t_2 - t_1:.2f} s')
            return ans
        return wrapped
    return decorator

def f_0():
    data = np.random.random((14_000, 1_000))  # 0.1 GB numpy array
    # print(data.nbytes / 1024 / 1024 / 1024)
    # format 1 - dictionary of lists
    data_b = {idx: list(val) for idx, val in enumerate(data)}
    # format 2 - pandas dataframe
    data_p = pd.DataFrame(data)
    # save data
    with open('1.pickle', 'wb') as file:
        pickle.dump(data_b, file)
    data_p.to_pickle('2.pickle')

@measure_running_time()
def f_1():
    with open('1.pickle', 'rb') as file:
        pickle.load(file)

@measure_running_time()
def f_2():
    pd.read_pickle('2.pickle')

if __name__ == '__main__':
    # f_0()
    f_1()
    f_2()

输出:

f_1() running time is 5.52 s
f_2() running time is 0.11 s

最新更新