有效地加载8gb腌制文件

时间:2019-07-15 14:11:57

标签: json python-3.x pickle dump

我使用以下代码腌制了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)

我想减少加载时间。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

可能的解决方案是以另一种格式存储数据。考虑以下代码。与泡菜存储的数据完全相同。唯一的区别是格式-列表字典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