まとめはじめにPythonで大量のcsvファイルを読み込む方法について、読み込み速度の比較検討した備忘録です。CSVファイル単体での読み込み方法は前回の記事をご覧ください。Life2019.09.02【python】csv読み込みはndarrayで扱う場合もpandasで読み込もうhttps://lotti.info/fast_read_csv/はじめにPythonにてcsvファイルを読み込んでデータ処理する場合の備忘録です。kerasなど一部のライブラリではnumpy.ndarrayしか受け付けないものがあります。numpy.ndarrayで扱うの...先に結論から言うと、確認した範囲で大量のcsvファイルを読み込む高速に読み込む方法は、シングルプロセスで実行する場合はテスト5の「pandas.read_csvをリスト内包表記で実行してpandas.concatで結合」する方法、CPU使用率が大幅に上がっても良い場合、マルチプロセスで実行する方法のテスト6「pandas.read_csvをmapで実行してnumpy.vstackで結合」する方法となりました。3.6.5テストデータは100行100列の乱数(0~1)でcsvファイルを1000個作成します。↓このようなcsvデータが1000個作成されました。これをテストデータとします。python実行の作業ディレクトリにcsvファイル1000個作成されます。新規フォルダ作成して作業ディレクトリを変更してから実行しましょう。単体のcsvファイルの場合、numpy.loadtxtよりもpandas.read_csvの方が高速に読み込むことができます。そこでまずは、単純にfor文を使ってpandas.read_csvを全csvファイル読み込む方法です。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:46.762s全csvファイルを読み込むのに46.762秒かかりました。この結果をベンチマークとします。for文の処理速度は遅いので、次はforの代わりにmapを使用します。テスト2pandas.read_csvをmapで実行してpandas.concatで結合for文を使わずにmapにて高速化を図る。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:15.187s15.187sでした。テスト1のfor文よりもmapを使う方が3倍ほど高速に読み込みできました。テスト3pandas.read_csvをリスト内包表記で実行してpandas.concatで結合mapの代わりにリスト内包表記を使ってみます。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:14.982s14.982sでした。テスト2とほぼ変わりません。誤差の範囲だと思います。コードはテスト2よりすっきりしました。テスト4マルチプロセスでpandas.read_csvをmapで実行してpandas.concatで結合テスト2のmapを並列処置(マルチプロセス)で実行します。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:5.630s5.630sでした。並列処理によりテスト2より倍以上高速になりました。並列処理なので当たり前ですがCPU率が大幅に上がります(100%近くなりました)。CPU使用率を気にする場合はテスト3の方法が無難です。テスト5マルチプロセスでpandas.read_csvを内包表記で実行してpandas.concatで結合テスト3の内包表記を並列処理(マルチプロセス)で実行します。並列処理にはJoblibライブラリを使用します。pipにてインストールしておきます。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:5.573s5.573sでした。テスト4のmap並列処理とほぼ変わりません。これも誤差の範囲だと思います。テスト5はテスト4に比べて新規にJoblibライブラリのインストールが必要なので少し面倒です。そのため、以降はmapでの並列処理について検討していきます。テスト6マルチプロセスでpandas.read_csvをmapで実行してnumpy.vstackで結合データの結合はpnadas.concatよりもnumpy.vstackの方が高速に処理できます。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:5.263s5.263sでした。テスト4よりすこし高速になりました。注意点として、一旦dataframeからnumpyに変換しているのでカラム名が消失しています。カラム名が必要な場合は別途カラム名を再割り付けすつ処理を忘れずに。テスト7マルチプロセスでdd.read_csvをmapで実行してnumpy.vstackで結合(参考)参考にCSVファイルの高速読み込みが可能なdaskライブラリを使った方法も確認します。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:27.490s27.490sでした。テスト6より5倍以上遅くなりました。daskでのcsv読み込みはサイズの大きいcsvには有効ですが、今回のようにサイズの小さなcsvを複数読み込む場合にはオーバーヘッドが大きく不利になるようです。テスト8io.StringIOをmapで実行してpd.read_csvで読み込み(参考)参考にopenとio.StringIOを使った方法も確認します。print('csv読み込み時間:{:.3f}s'.format(process_time))実行結果csv読み込み時間:12.671s12.671sでした。テスト3より15%ほど早くなりました。シングルプロセスの場合はこれが一番早いかもしれません。まとめ大量のcsvファイルを高速に読み込む方法を検討しました。今回紹介した方法が必ずしもベストではなく、csvファイルのサイズとファイル数によって読み込み速度は異なってきます。単純なfor文は想定通り遅く、mapやリスト内包表記を使用することで速度アップができました。並列処理することでより高速に読み込むことができました。並列処理はCPU使用率が大幅UPするデメリットもあるので注意が必要です。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。Pythonにてcsvファイルを読み込んでデータ処理する場合の備忘録です。...PREV【python】csv読み込みはndarrayで扱う場合もpandasで読み込もうNEXT統計検定2級のCBT方式試験の特徴と受験の流れを紹介Profilepometa社会人エンジニアのぽめたです。AFFINGER5.。