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

IT全般

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

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

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

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

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

pickle --- Python オブジェクトの直列化
ソースコード: Lib/pickle.py pickle モジュールは Python オブジェクトの直列化および直列化されたオブジェクトの復元のためのバイナリプロトコルを実装しています。"Pickle 化" は Python オブジェクト階層をバイトストリームに変換する処理、"非 pickle 化" は ( バイナリフ...
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をコピーしました