「pandasでメモリ節約しながらデータ分析」:大規模データを扱うためのテクニック

大規模なデータを扱う場合、メモリの使用量を節約することは重要な課題です。特に、pandasのようなデータ分析用ライブラリを使用する場合、大量のデータを処理する際にメモリの使用量が増加し、処理が遅くなる可能性があります。

この記事では、pandasを使用しながらメモリを節約するためのテクニックについて紹介します。

データ型の最適化

pandasでは、データを扱うためのデータ型がいくつか用意されています。例えば、整数型や浮動小数点型、文字列型などです。適切なデータ型を選択することで、メモリ使用量を削減することができます。

例えば、整数型のデータを扱う場合には、int8、int16、int32、int64のいずれかを選択することができます。データの範囲に応じて適切なデータ型を選択することで、データの格納に必要なメモリを節約することができます。

以下は、ランダムな整数値を要素とする1,000,000行×1列のデータフレームを作成し、各データ型におけるメモリ使用量を比較した例です。

import pandas as pd
import numpy as np

# 1,000,000行×1列のデータフレームを作成する
df = pd.DataFrame({'col': np.random.randint(-128, 127, 1000000)})

# 各データ型におけるメモリ使用量を比較する
print(df.dtypes)
print(df.memory_usage())

実行結果は以下のようになります。

col int32
dtype: object
Index 128
col 4000000
dtype: int64

この結果から、int64型を使用した場合には、データ列の両方で4,000,000バイトのメモリが必要であることが分かります。一方で、int8型を使用した場合には、データ列のみで1,000,000バイトのメモリが必要です。よって、適切なデータ型を選択することで、メモリ使用量を大幅に削減することができます。

チャンク処理

データが非常に大きい場合、一度に全てのデータを処理することは困難です。そのため、データを分割し、一部ずつ処理する「チャンク処理」を行うことが有効です。

以下は、1,000,000行×100列のデータフレームを作成し、列ごとに平均値を計算する例です。

import pandas as pd
import numpy as np

# 1,000,000行×100列のデータフレームを作成する
df = pd.DataFrame(np.random.rand(1000000, 100))

# 列ごとに平均値を計算する
means = []
for chunk in pd.read_csv('large_data.csv', chunksize=10000):
    means.append(chunk.mean())

# 平均値を結合する
result = pd.concat(means, axis=1)

# 結果を表示する
print(result)

ここでは、read_csvメソッドの引数chunksizeを設定して、10,000行ずつのチャンクに分割しています。それぞれのチャンクに対して、meanメソッドを使用して平均値を計算し、結果をリストに追加します。全てのチャンクの処理が完了した後に、concatメソッドを使用してリストに含まれる平均値を結合しています。

不要な列や行の削除

データフレームには、不要な列や行が含まれる場合があります。例えば、全ての値が同じである列や、欠損値しか含まれない行などです。このような列や行を削除することで、データフレームのサイズを縮小することができます。

以下は、ランダムな整数値を要素とする1,000,000行×100列のデータフレームを作成し、全ての値が同じである列や欠損値しか含まれない行を削除する例です。

import pandas as pd
import numpy as np

# 1,000,000行×100列のデータフレームを作成する
df = pd.DataFrame(np.random.randint
(-10, 10, size=(1000000, 100)))
# 欠損値しか含まれない行を削除する
df = df.dropna()

# 結果を表示する
print(df)

ここでは、dropnaメソッドを使用して、欠損値しか含まれない行を削除しています。これにより、データフレームのサイズを縮小することができます。

キャッシングとGCの活用

キャッシングとGC(ガベージコレクション)は、pandasでメモリを節約するための有効なテクニックです。

キャッシングは、メモリ上に一時的に保持されるデータのことを指します。データを再利用する際には、再度読み込みを行う必要がなくなるため、処理速度を向上することができます。

GCは、メモリ上に不要なオブジェクトが残らないように、不要なオブジェクトを自動的に解放する機能です。pandasでは、GCが自動的に実行されるため、メモリの解放と再利用が行われます。

まとめ

以上のように、pandasを使用しながらメモリを節約するためのテクニックについて紹介しました。大規模なデータを扱う場合には、適切なデータ型の選択や、チャンク処理、不要な列や行の削除、キャッシングやGCの活用などが有効な手段となります。

これらのテクニックを活用することで、pandasで大規模なデータを効率的に処理することができます。