【问题标题】:Speeding up Loading of Pandas Sparse DataFrame加快 Pandas Sparse DataFrame 的加载速度
【发布时间】:2015-03-20 18:21:15
【问题描述】:

我生成了一个大的腌制稀疏数据帧,但由于它太大而无法保存在内存中,我不得不在生成时逐步追加,如下所示:

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

谢谢!

【问题讨论】:

    标签: python pandas pickle concat sparse-matrix


    【解决方案1】:

    不要循环连接!这是文档中的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 TIME的副本,并且它正在增长,因此这根本没有效率。

    习惯用法是追加到一个列表,然后在最后做一个单一的连接。

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

    【讨论】:

    • 谢谢!我明天早上试试这个! DataFrame 非常稀疏,我在使用 HDF5 的密集格式的 DataFrame 时遇到了内存问题。有没有办法在 HDF5 中编写稀疏 DF?谢谢:)
    • 可以写一个固定格式的稀疏帧(表格格式没实现)
    • 您不能附加到单一模式,但您可以根据需要简单地编写节点,并在您读出时附加它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2010-12-14
    • 2012-07-01
    • 2017-08-12
    相关资源
    最近更新 更多