加速 Pandas 稀疏数据帧的加载

Speeding up Loading of Pandas Sparse DataFrame

我生成了一个大的 pickled Sparse DataFrame,但由于它太大而无法保存在内存中,所以我不得不在生成时逐步追加,如下所示:

with open(data.pickle, 'ab') as output:
    pickle.dump(df.to_sparse(), output, pickle.HIGHEST_PROTOCOL)

然后为了读回文件,我执行以下操作:

df_2 = pd.DataFrame([]).to_sparse()
with open(data.pickle, 'rb') as pickle_file:
    try:
        while True:
            test =  pickle.load(pickle_file)
            df_2 = pd.concat([df_2, test], ignore_index= True)
    except EOFError:
        pass

鉴于此文件的大小 (20 GB),此方法有效,但显然需要很长时间。是否可以并行化 pickle.load/pd.concat 步骤以加快加载时间?或者是否有任何其他加速此过程的建议,特别是在代码的加载部分。

注意:生成步骤是在资源少得多的计算机上完成的,这就是为什么在功能更强大的机器上完成的加载步骤可以将 DF 保存在内存中的原因。

谢谢!

不要循环连接!这是文档中的一个note,也许应该是一个警告

df_list = []
with open(data.pickle, 'rb') as pickle_file:
    try:
        while True:
            test =  pickle.load(pickle_file)
            df_list.append(test)
    except EOFError:
        pass

df_2 = pd.concat(df_list), ignore_index= True)

您正在循环中 EACH 复制帧,而且它还在增长,所以这根本没有效率。

习惯用法是追加到一个列表,然后在最后做一个 concat all。

此外,在数据生成中写入 HDF5 文件会更好。哪个更快,可压缩。你通常可以写一个完整的 df,除非当你打开压缩时它非常稀疏。