• 笔记·Pandas几类数据读写方法对比


    Pandas读取文件类型的数据方法有很多,当读取大文件时往往需要一点技巧来提高效率。

    简单对比一下csv,parquet,feather和pickle这几类数据的读写效率,正好最近在处理轨迹数据,特别记录在此。

    1.csv格式

    csv格式可以通过文本形式直接读取,但是读取和存储效率较低。

    1. '''
    2. 读取csv文件示例,16828849条数据,1.32GB
    3. '''
    4. pd_csv = pd.read_csv("data.csv") # 最常规的读取方式,也是最慢的
    5. # time 11.286217212677002s
    6. pd_csv_pa = pd.read_csv("data.csv", engine="pyarrow") # 利用pyarrow引擎,可以大幅提高效率
    7. # time 3.797694206237793s
    8. '''
    9. 存储csv文件示例
    10. '''
    11. pd_csv.to_csv("data.csv") # 存储csv效率很低
    12. # time 55.74313497543335s

    2.parquet格式

    parquet被广泛用作表格数据集的主要文件格式,在Hadoop生态中被广泛应用,所以此类格式适用于Java、Scala、Python、R的环境中,兼顾适用范围和效率。

    pandas1.4版本之后,使用parquet可以调用pyarrow和fastparquet两个引擎,需要额外安装。

    1. # parrow:
    2. pip install pyarrow
    3. # fastparquet:
    4. pip install fastparquet>=0.8
    5. pip install python-snappy
    1. '''
    2. 读取parquet文件示例,16828849条数据,313MB
    3. '''
    4. pd_pq_pa = pd.read_parquet("data.parquet", engine="pyarrow")
    5. # time 2.2554268836975098s
    6. pd_pq_fp = pd.read_parquet("data.parquet", engine="fastparquet")
    7. # time 1.7567646503448486s
    8. '''
    9. 存储parquet文件示例
    10. '''
    11. pd_pq.to_parquet("data.parquet") # 当安装过pyarrow之后默认使用pyarrow
    12. # time 5.019140005111694s
    13. pd_pq.to_parquet("data.parquet", engine="pyarrow")
    14. # time 5.126128911972046s
    15. pd_pq.to_parquet("data.parquet", engine="fastparquet") # 这个存储有点问题,用fastparquet存储之后为862MB,而且读取报错,不知道是不是环境问题,暂时不细究,建议不使用
    16. # time 14.370543479919434s

    engine参数如下图,当安装过pyarrow之后默认使用pyarrow

    3.feather格式

    feather是一种可移植的文件格式,用于存储Arrow表或数据帧,适用于Python和R语言,读写效率高。

    1. '''
    2. 读取feather文件示例,16828849条数据,980MB
    3. '''
    4. pd_ft = pd.read_feather("data.feather")
    5. # time 1.6818311214447021s
    6. '''
    7. 存储feather文件示例
    8. '''
    9. pd_ft.to_feather("data.feather")
    10. # time 2.6491539478302s

    4.pickle格式

    pickle文件是Python用来序列化和反序列化对象的方法,虽然可以用来存储数据,效率也很高,但是需要注意的是只适用于Python环境,且容易引发安全问题,使用时需要格外注意。

    1. '''
    2. 读取pickle文件示例,16828849条数据,803MB
    3. '''
    4. pd_pkl = pd.read_pickle("data.pkl")
    5. # time 1.2140724658966064s
    6. '''
    7. 存储pickle文件示例
    8. '''
    9. pd_pkl.to_pickle("data.pkl")
    10. # time 4.325848817825317s

    方法对比

    Parserread timesave timefile size
    Default csv11.2s55.74s1.32GB
    PyArrow csv3.8s
    PyArrow parquet2.25s5.13s313MB
    Fastparquet1.76s14.37s862MB
    Default feather1.68s2.65s980MB
    Default pickle1.21s4.33s803MB

    结论

    显然相较于csv,不管是parquet、feather还是pickle都有非常明显的效率提升,通过对比可以简单得出结论:
    1.feather无论是读取还是写入的效率都是最高的,唯一的缺点就是数据量比较大,如果只使用Python且不缺少存储空间的可以考虑;

    2.pickle与feather相似,适合只使用Python的用户,且可以存储对象等其他数据结构

    3.对于有空间要求的用户,parquet是一个不错的选择,并且适用于分布式计算场景中,保持较快读取速度的同时可以减少数据的传输量,比较推荐。(参数方面可以选择使用fastparquet去读取,pyarrow进行存储,这里不知道是不是我的设置问题)

    4.一般数据处理而言,还是建议尽量减少使用csv,保障处理的效率

  • 相关阅读:
    C++:什么情况下函数应该声明为纯虚函数
    Redis高级数据结构HyperLogLog
    黑客技术-小白自学
    LVS-NAT模式实验案例
    Java—Map
    微软放大招!Bing支持DALL-E3,免费AI绘画等你来体验!
    什么情况?吉利减持沃尔沃股份套现3.5亿美元
    农产品溯源中GIS应用
    什么是IO多路复用?Redis中对于IO多路复用的应用?
    如何在一分钟了解jwt
  • 原文地址:https://blog.csdn.net/qq_40153886/article/details/126158343