3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Python Pandasを使った大規模CSVファイルの高速処理方法

Last updated at Posted at 2024-07-14

はじめに

こんにちは!今回は、Pythonの人気データ処理ライブラリであるPandasを使って、大規模CSVファイルを効率的に処理する方法をご紹介します。大量のデータを扱う際、メモリ使用量や処理速度が問題になることがありますが、適切な手法を用いることでこれらの課題を克服できます。

目次

  1. チャンクを使った読み込み
  2. データ型の最適化
  3. 不要な列の削除
  4. 並列処理の活用
  5. CSV書き出しの最適化

image.png

チャンクを使った読み込み

大規模なCSVファイルを一度に読み込むとメモリ不足になる可能性があります。Pandasのread_csv関数のchunksizeパラメータを使用することで、ファイルを小さな塊(チャンク)に分けて読み込むことができます。

import pandas as pd

chunk_size = 100000  # 各チャンクのサイズ
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
    # チャンクごとの処理をここに書く
    process_chunk(chunk)

この方法を使えば、大きなファイルでもメモリ使用量を抑えながら処理できます。

データ型の最適化

Pandasはデフォルトでは64ビットのデータ型を使用しますが、多くの場合これは過剰です。データ型を適切に指定することで、メモリ使用量を大幅に削減できます。

dtypes = {
    'id': 'int32',
    'value': 'float32',
    'category': 'category'
}

df = pd.read_csv('large_file.csv', dtype=dtypes)

特に、カテゴリカルデータに対して'category'型を使用すると、メモリ使用量が大幅に削減されます。

不要な列の削除

大規模なCSVファイルには、処理に不要な列が含まれていることがあります。これらの列を早い段階で削除することで、メモリ使用量を減らし、処理速度を向上させることができます。

useful_columns = ['id', 'value', 'category']
df = pd.read_csv('large_file.csv', usecols=useful_columns)

並列処理の活用

Pandasは単一のCPUコアでの処理が基本ですが、multiprocessingライブラリを使用することで、並列処理を実現できます。

from multiprocessing import Pool

def process_chunk(chunk):
    # チャンクの処理ロジックをここに書く
    return processed_chunk

if __name__ == '__main__':
    pool = Pool(processes=4)  # プロセス数を指定
    results = []

    for chunk in pd.read_csv('large_file.csv', chunksize=100000):
        results.append(pool.apply_async(process_chunk, (chunk,)))

    processed_chunks = [result.get() for result in results]
    
    # 処理結果の結合
    final_result = pd.concat(processed_chunks)

CSV書き出しの最適化

処理結果を再びCSVファイルに書き出す際も、チャンクを使用することで効率的に行えます。

chunk_size = 100000
for i, chunk in enumerate(pd.read_csv('large_input.csv', chunksize=chunk_size)):
    # チャンクの処理
    processed_chunk = process_chunk(chunk)
    
    # 最初のチャンクの場合はヘッダーを書き出し、それ以外はヘッダーなしで追記
    mode = 'w' if i == 0 else 'a'
    header = i == 0
    processed_chunk.to_csv('large_output.csv', mode=mode, header=header, index=False)

以上の方法を組み合わせることで、大規模なCSVファイルでも効率的に処理することができます。データの特性や処理内容に応じて、最適な方法を選択してください。

大規模データ処理において、メモリ使用量と処理速度のバランスを取ることは重要です。これらの手法を適切に活用することで、より効率的なデータ処理が可能になります。Happy coding!

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?