加快Pandas Sparse DataFrame的加载速度

时间:2015-03-20 18:21:16

标签: python pandas pickle concat sparse-matrix

我有一个我生成的大型腌制稀疏数据框架,但由于它太大而无法保存在内存中,因此我必须按生成后逐步追加,如下所示:

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保存在内存中的原因。

谢谢!

1 个答案:

答案 0 :(得分:2)

不要在循环中连接!这是文档中的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)

您现在正在循环中复制框架每个时间,并且它正在增长,所以这根本没有效率。

成语是附加到列表中,然后在最后执行单个concat。

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