大きなファイルサイズのcsvをpythonで高速に読込む

IT全般

pythonでデータ分析を行うときにはcsvファイルからデータを読み込むことが多いです。

しかし、csvファイルのサイズが大きくなってくると、読み込み速度が遅くなります。

csvファイルの読み込み速度を高速化する2種類の方法について紹介します。

pickleファイル形式に変換する

csvファイルを読込み速度の速いpickleファイル形式に一度変換して利用する方法です。

pickle --- Python オブジェクトの直列化 — Python 3.9.4 ドキュメント
import pandas as pd

name = '任意のファイル名'

df=pd.read_csv(name +'.csv') # 一度csvファイルを読込み
df.to_pickle(name + '.pickle') # pickle ファイルに変換

df1 = pd.read_pickle(name + '.pickle') # pickleファイルの読み込み

手元のデータで比較したところ、pickle形式で読込むことでcsvよりも6倍程度読み込みが高速化されました。

読込み時間の比較

csvファイルをread_csvで読込:6.4s

pickleファイルをread_pickleで読込:1.0s

datatableパッケージを利用する

pandasでなく、datatableというパッケージを利用するパターンもあります。

Getting Started — datatable documentation

pipでinstallします。

pip install datatable

.fread()で読み込み可能です。

.to_pandas()でpandas形式に変換も可能です。

import datatable as dt

name = '任意のファイル名'
df = dt.fread(name +'.csv')

df1 = df.to_pandas()

読込み時間は以下の通りで、datatableを用いると10倍ほど高速化されます。

読込み時間の比較

csvファイルをread_csvで読込:6.4s

pickleファイルをread_pickleで読込:1.0s

csvファイルをfreadで読込:0.6s

pickleとdatatableの使い分け

pickle形式を用いる場合には、最初のpickleデータへの変換に時間がかかります。

一方で、datatableもpandas形式に変換する場合時間がかかります。

データ変換時間の比較

csvをpickleに変換:5.6s

datatable形式からpandas形式に変換:2s

しかし、pickleは一度データを変換してしまえば、2度目から変換の時間がかかりません。

従って、pickleとdatatableの使い分けは以下のような形が良いのではないかと考えます。

読込み方式の使い分け

pickle : データベース(csv)の頻繁な更新がない場合

datatable : データベース(csv)が頻繁に更新される場合

コメント

タイトルとURLをコピーしました