【问题标题】:How to read picke files using pyarrow如何使用 pyarrow 读取picke文件
【发布时间】:2021-09-23 08:28:56
【问题描述】:

我有一堆代码可以使用 Pandas 读取多个 pickle 文件:

dfs = []
    for filename in glob.glob(os.path.join(path,"../data/simulated-data-raw/", "*.pkl")):
        with open(filename, 'rb') as f:
            temp = pd.read_pickle(f)
            dfs.append(temp)
    df = pd.DataFrame()
    df = df.append(dfs)

如何使用pyarrow 读取文件?同时,这种方式不起作用并引发错误。

dfs = []
for filename in glob.glob(os.path.join(path, "../data/simulated-data-raw/", "*.pkl")):
    with open(filename, 'rb') as f:
        temp = pa.read_serialized(f)
        dfs.append(temp)
df = pd.DataFrame()
df = df.append(dfs)

【问题讨论】:

    标签: python pandas pickle apache-arrow


    【解决方案1】:

    仅供参考,pyarrow.read_serialized 已弃用,如果愿意序列化数据,您应该只使用箭头 ipc 或 python 标准 pickle 模块。

    无论如何,我不确定您要实现什么,使用 Pickle 保存对象会尝试使用与保存时完全相同的类型对它们进行反序列化,因此即使您不使用 pandas 来加载对象,你仍然会得到一个 pandas DataFrame(因为那是你腌制的),并且仍然需要安装 pandas 才能创建一个。

    例如,您可以轻松摆脱 pandas.read_pickle 并仅将其替换为 pickle.load,但您得到的仍然是 pandas.DataFrame

    import pandas as pd
    original_df = pd.DataFrame({"foo": range(5), "bar": range(5, 10)})
    pd.to_pickle(original_df, "./dummy.pkl")
    
    import pickle
    loaded_back = pickle.load(open("./dummy.pkl", "rb"))
    print(loaded_back)
    

    【讨论】:

    • 谢谢!但我的 Q 主要是关于如何使用箭头加载泡菜。然后,您提到我不需要使用arrow 加载泡菜。不过,基本上,我正在寻找最节省内存的方法来保存和加载泡菜 - 假设 pandas.read_pickle() 不是最好的,因为使用 pyarrow 读取 CSV 文件效率更高。
    • Pickle 的设计并不完全以性能为核心价值。我想,由于零拷贝支持,pickle 版本 5 改进了很多,但总的来说,如果你关心性能,我建议你切换到使用不同的编组格式。例如,您可能会考虑将这些文件转换为 Arrow IPC 格式,它有一个方便的方法,可以将数据读回 pandas 数据帧 (arrow.apache.org/docs/python/…),它应该比 pandas.read_pickle
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2019-10-27
    • 2018-05-06
    • 2021-02-11
    • 2021-08-31
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多