Pandasのデータフレームを軽量化!メモリリークを防ぐ方法!

はじめに

Pythonのデータ分析ライブラリであるPandasは、大規模なデータセットの処理に非常に便利です。しかし、大量のデータを扱う際にはメモリ使用量の問題が発生することがあります。本記事では、Pandasのデータフレームを軽量化し、メモリリークを防ぐ方法を紹介します。

データ型の最適化

Pandasのデータフレームでは、各列のデータ型を指定することができます。適切なデータ型を選択することで、メモリ使用量を削減することができます。例えば、整数のカラムがある場合には、デフォルトのint64ではなく、int32やint16といったデータ型を選択することで、メモリ使用量を半減させることができます。

import pandas as pd
# データフレームの作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5],
                   'B': [1.1, 2.2, 3.3, 4.4, 5.5],
                   'C': ['apple', 'banana', 'cherry', 'durian', 'elderberry']})
# データ型の確認
print(df.dtypes)

上記のコードを実行すると、以下のような結果が得られます。

A     int64
B   float64
C    object
dtype: object

データフレームの各列のデータ型は、dtypes属性で確認することができます。上記の結果から分かるように、カラムAはint64、カラムBはfloat64、カラムCはobjectとなっています。

# データ型の最適化
df['A'] = df['A'].astype('int32')
df['B'] = df['B'].astype('float32')
# 最適化後のデータ型の確認
print(df.dtypes)

上記のコードを実行すると、以下のような結果が得られます。

A      int32
B    float32
C     object
dtype: object

データフレームの各列のデータ型をastypeメソッドを使って変換することで、メモリ使用量を削減することができます。

メモリ使用量の確認

Pandasには、データフレームのメモリ使用量を確認するための便利なメソッドが用意されています。その中でも特によく使われるのがinfo()メソッドとmemory_usage()メソッドです。

# メモリ使用量の確認
print(df.info())
print(df.memory_usage())

上記のコードを実行すると、以下のような結果が得られます。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
     Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   A       5 non-null      int32  
 1   B       5 non-null      float32
 2   C       5 non-null      object 
dtypes: float32(1), int32(1), object(1)
memory usage: 268.0+ bytes
None
Index    128
A         20
B         20
C         60
dtype: int64

info()メソッドは、データフレームのカラムごとのデータ型や非nullの個数、メモリ使用量などの情報を表示します。memory_usage()メソッドは、各カラムのメモリ使用量をバイト単位で表示します。

不要なカラムの削除

データフレームから不要なカラムを削除することで、メモリ使用量を削減することができます。

# 不要なカラムの削除
df.drop(columns=['C'], inplace=True)
# カラム削除後のメモリ使用量の確認
print(df.memory_usage())

上記のコードを実行すると、以下のような結果が得られます。

A    20
B    20
dtype: int64

dropメソッドを使用して不要なカラムを削除することで、メモリ使用量を削減することができます。

データのチャンク処理

大規模なデータセットを一度にメモリに読み込むと、メモリ使用量が急増してしまうことがあります。このような場合には、データをチャンクに分割して読み込むことで、メモリ使用量を制御することができます。

# データのチャンク処理
chunk_size = 2
for chunk in pd.read_csv('data.csv', chunksize=chunk_size):
    # チャンクごとの処理
    print(chunk)

上記のコードを実行すると、データセットを2つのチャンクに分割して読み込み、チャンクごとに処理を行うことができます。

ガベージコレクションの活用

Pythonのガベージコレクション(GC)は、不要なメモリを自動的に解放する仕組みです。Pandasでは、gcモジュールを活用することで、メモリの解放を促すことができます。

import gc
# メモリの解放
gc.collect()

上記のコードを実行することで、不要なメモリを解放することができます。

まとめ

Pandasのデータフレームを軽量化し、メモリリークを防ぐ方法について紹介しました。データ型の最適化、メモリ使用量の確認、不要なカラムの削除、データのチャンク処理、ガベージコレクションの活用など、様々な方法を組み合わせることで、メモリ使用量を効果的に削減することができます。大規模なデータセットを扱う際には、これらのテクニックを活用して、スムーズなデータ処理を行いましょう。