3000万行的csv文件直接用普通的read_csv(‘XXX.csv’)读取会卡死,或者报超出内存的错误,一周的时间测试了几个方法,在这里总结一下
dask.dateframe
这个库基本实现了所有pandas.DateFrame的方法,
适用场景:对大型csv文件进行逐行处理、筛选等操作,或者分组求均值等极其合适,总之就是如果对大型数据进行一些简单操作并将其保存为小型数据集非常合适。
但不适用于需要对数据集进行复杂操作的情况,因为这个库在读取数据的时候采用的是切片的方法,不会把它全量读到内存中去,如果想看数据的某一行需要使用compute()函数,这个函数非常耗时,不能频繁使用。
具体操作参考官方网页:https://docs.dask.org/en/stable/
pandas read_csv函数
主要用到read_csv的以下四个参数
dtype=,设置每列的数据类型
usecols=,只读取指定列
iterator=True,读取数据的迭代器
chunksize=10000 每次读取10000行
生成迭代器后,利用concat函数将csv读为dataframe
举例:
dtype = {'列1':str,'列2':'int16','列3':'str'}
need_cols = ['列1','列2']
df_iter = pd.read_csv('./XXX.csv',dtype=dtype, usecols=need_cols, iterator=True, chunksize=10000)
df = pd.concat([dfi for dfi in df_iter])
加速读取
如果csv文件会被频繁读入python,可以再第一次读取时采用read_csv的方法将csv文件读入后,将其保存为.pkl文件,后续再需要读取时就直接读pkl文件,读取速度会快很多
try:
df = pd.read_pickle('XXX.pkl')
df.astype({'列1':str,'列2':'int16'})
except (FileNotFoundError):
dtype = {'列1':str,'列2':'int16','列3':'str'}
need_cols = ['列1','列2']
df_iter = pd.read_csv('./XXX.csv',dtype=dtype, usecols=need_cols, iterator=True, chunksize=10000)
df = pd.concat([dfi for dfi in df_iter]
df.to_pickle('XXX.pkl')
读取包含3000多万行,30多列的pkl文件用时20秒