我使用以下代码腌制了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)
我想减少加载时间。
有人可以帮我吗?
答案 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