Pandas 几类数据读写方法对比-CSV,parquet,feather 和 pickle

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

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

1.csv格式

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

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

2.parquet格式

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

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

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

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

file

3.feather格式

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

'''
读取feather文件示例,16828849条数据,980MB
'''
pd_ft = pd.read_feather("data.feather")
# time 1.6818311214447021s
'''
存储feather文件示例
'''
pd_ft.to_feather("data.feather")
# time 2.6491539478302s

4.pickle格式

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

'''
读取pickle文件示例,16828849条数据,803MB
'''
pd_pkl = pd.read_pickle("data.pkl")
# time 1.2140724658966064s
'''
存储pickle文件示例
'''
pd_pkl.to_pickle("data.pkl")
# time 4.325848817825317s

方法对比

file

结论

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

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

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

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

为者常成,行者常至