pandas高效读取大文件(csv)方法之-parquet
生活随笔
收集整理的這篇文章主要介紹了
pandas高效读取大文件(csv)方法之-parquet
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、數據類型輕量化
def reduce_df_memory(df):""" iterate through all the columns of a dataframe and modify the data typeto reduce memory usage. """start_mem = df.memory_usage().sum() / 1024 ** 2print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))for col in df.columns:col_type = df[col].dtypeif col_type != object:c_min = df[col].min()c_max = df[col].max()if str(col_type)[:3] == 'int':if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:df[col] = df[col].astype(np.int8)elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:df[col] = df[col].astype(np.int16)elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:df[col] = df[col].astype(np.int32)elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:df[col] = df[col].astype(np.int64) else:if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:df[col] = df[col].astype(np.float16)elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:df[col] = df[col].astype(np.float32)else:df[col] = df[col].astype(np.float64)end_mem = df.memory_usage().sum() / 1024**2print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))return df分塊讀取
一次性加載會出現內存溢出,24G內存都不夠
chunk_iter = pd.read_csv('train.csv',chunksize=100000) train_data = pd.DataFrame() num = 0 for chunk in chunk_iter:tmp_df = reduce_df_memory(chunk)train_data = pd.concat([train_data, tmp_df])如果提前知曉數據類型
data_types_dict = {'time_id': 'int32','investment_id': 'int16',"target": 'float32', }features = [f'f_{i}' for i in range(300)]for f in features:data_types_dict[f] = 'float32'target = 'target' train_data = pd.read_csv(f'{root_path}/data/train.csv', # nrows=5 * 10 ** 4, usecols=data_types_dict.keys(), dtype=data_types_dict)二、存儲數據類型轉換
上述數據轉換成CSV,內存從18G縮小到7G左右,仍然較大,且每次加載CSV都會需要5分鐘左右;所以將CSV類型轉換成parquet可以變得更快,更小;
(parquet存儲不支持float16數據類型, int8,所以第一步數據類型輕量化中需要注意數據類型)
而且加載速度非常快,只需要14.4s
結論:
1、由于pandas加載csv文件默認數據格式是int64,float64等類型,非常吃內存
2、parquet高效的壓縮編碼,用于降低存儲成本
三、parquet高效的讀取能力,用于支撐快速查詢
問題1:pickle與之相比,速度會怎么樣呢?
實驗證明:加載速度Pickle(2s)速度是parquet(29s)的10倍;文件大小是一樣的;
總結
以上是生活随笔為你收集整理的pandas高效读取大文件(csv)方法之-parquet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas中一列拆分成两列
- 下一篇: bootstrap与zookeeper区