日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pandas高效读取大文件(csv)方法之-parquet

發布時間:2025/3/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,所以第一步數據類型輕量化中需要注意數據類型)

train_data.to_parquet(f'{root_path}/data/train.parquet') pd.read_parquet(f'{root_path}/data/train.parquet')


而且加載速度非常快,只需要14.4s

結論:

1、由于pandas加載csv文件默認數據格式是int64,float64等類型,非常吃內存
2、parquet高效的壓縮編碼,用于降低存儲成本

三、parquet高效的讀取能力,用于支撐快速查詢

問題1:pickle與之相比,速度會怎么樣呢?

實驗證明:加載速度Pickle(2s)速度是parquet(29s)的10倍;文件大小是一樣的;

總結

以上是生活随笔為你收集整理的pandas高效读取大文件(csv)方法之-parquet的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。