Pythonでメモリ効率を考慮して大量のCSVファイルデータを処理する方法

この記事では、Pythonを用いて大量のCSVファイルデータをメモリ効率を考慮しながら処理する方法について解説します。具体的なコード例とその解説、応用例を含めて説明していきます。

目次

はじめに

Pythonはデータ処理に優れており、多くの企業や研究機関で使われています。しかし、大量のCSVファイルを一度に処理しようとすると、メモリが圧迫されてしまう問題があります。本記事では、この問題を解決するためのいくつかの方法を紹介します。

基本的な考え方

大量のCSVファイルを効率良く処理するには、以下の点に注意が必要です。
– ファイルの読み込みを一部ずつ行う
– ジェネレータを利用する
– Pandasのチャンク処理を活用する

一部ずつの読み込み

CSVファイルを一部ずつ読み込むことで、メモリの使用量を抑えることができます。以下はその基本的なコード例です。

with open('example.csv', 'r') as f:
    # ヘッダーをスキップする
    header = next(f)
    for line in f:
        # 一行ずつ処理を行う
        print(line.strip().split(','))  # カンマで区切る

ジェネレータの活用

ジェネレータを使うことで、一度に全てのデータを読み込むのではなく、必要なデータだけを逐次的に読み込むことができます。

def read_csv(filename):
    with open(filename, 'r') as f:
        header = next(f)  # ヘッダーをスキップ
        for line in f:
            yield line.strip().split(',')

csv_gen = read_csv('example.csv')
for row in csv_gen:
    print(row)

Pandasのチャンク処理

Pandasライブラリには大量のデータを効率よく処理するための「チャンク処理」という機能があります。

import pandas as pd

chunk_size = 50000  # 一度に読み込む行数
chunks = []
for chunk in pd.read_csv('example.csv', chunksize=chunk_size):
    # ここでチャンクごとに処理を行う
    chunks.append(chunk)

df = pd.concat(chunks, axis=0)

応用例

例1: フィルタリングと集計

特定の条件にマッチする行だけを抽出し、その後集計を行います。

def filter_and_sum(filename, condition):
    total = 0
    with open(filename, 'r') as f:
        header = next(f)
        for line in f:
            row = line.strip().split(',')
            if condition(row):
                total += int(row[2])  # 3列目を集計
    return total

# 使用例
print(filter_and_sum('example.csv', lambda row: row[1] == 'A'))

例2: ジェネレータで複数ファイル処理

複数のCSVファイルを一つのジェネレータで逐次処理します。

def read_multiple_csv(filenames):
    for filename in filenames:
        with open(filename, 'r') as f:
            header = next(f)
            for line in f:
                yield line.strip().split(',')

# 使用例
filenames = ['example1.csv', 'example2.csv']
csv_gen = read_multiple_csv(filenames)
for row in csv_gen:
    print(row)

例3: データのマージと出力

複数のCSVファイルを読み込み、特定のキーでマージした後、新しいCSVファイルとして出力します。

import pandas as pd

def merge_csv(filenames, output_filename, key):
    dfs = [pd.read_csv(filename) for filename in filenames]
    merged_df = pd.concat(dfs, keys=key)
    merged_df.to_csv(output_filename)

# 使用例
merge_csv(['example1.csv', 'example2.csv'], 'merged.csv', ['ID'])

まとめ

Pythonで大量のCSVデータをメモリ効率良く処理する方法には、ファイルの一部ずつの読み込み、ジェネレータの活用、Pandasのチャンク処理があります。これらの方法を組み合わせて使うことで、さまざまな状況に対応することができます。

コメント

コメントする

目次