この記事では、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のチャンク処理があります。これらの方法を組み合わせて使うことで、さまざまな状況に対応することができます。
コメント