Pandas DataFrame'de Bellek Verimli Veri İşleme

Pandas ile milyonlarca satırı işlerken bellek tükenebilir. Sorunu çözmek için veri tiplerini optimize etmek, dosyayı parçalar halinde okumak ve gereksiz sütunları filtrelemek yeterli.

Veri Tiplerini Optimize Etme

Sayısal sütunları int64 yerine int32 veya kategorik tipe çevirmek belleği yarıya indirebilir. Örneğin, 1 milyon satırlı bir dosya okurken:

1import pandas as pd
2import numpy as np
3
4# Varsayılan okuma (yüksek bellek kullanımı)
5df = pd.read_csv('buyuk_dosya.csv')
6print(df.memory_usage(deep=True).sum() / 1024**2, 'MB')
7
8# Optimize edilmiş okuma
9dtype_dict = {
10'id': 'int32',
11'kategori': 'category',
12'fiyat': 'float32',
13'durum': 'category'
14}
15
16df_opt = pd.read_csv('buyuk_dosya.csv', dtype=dtype_dict)
17print(df_opt.memory_usage(deep=True).sum() / 1024**2, 'MB')

Beklenen çıktı: Bellek kullanımı %40-60 azalır.

Chunks ile Okuma

Devasa dosyaları tamamını belleğe almadan parçalar halinde işle:

1chunk_size = 50000
2total_sum = 0
3
4for chunk in pd.read_csv('buyuk_dosya.csv', chunksize=chunk_size, dtype=dtype_dict):
5# Her chunk için işlem yap
6total_sum += chunk['fiyat'].sum()
7# Chunk işlendikten sonra otomatik silinir
8
9print(f'Toplam: {total_sum}')

Gereksiz Sütunları Filtreleme

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Baştan ihtiyaç olmayan sütunları yükleme:

1usecols = ['id', 'kategori', 'fiyat', 'durum']
2df = pd.read_csv('buyuk_dosya.csv', usecols=usecols, dtype=dtype_dict)

Praktik Kombinasyon

Gerçek senaryoda tüm teknikleri birleştir:

1df_list = []
2
3for chunk in pd.read_csv(
4'buyuk_dosya.csv',
5chunksize=100000,
6usecols=['id', 'kategori', 'fiyat'],
7dtype={'id': 'int32', 'kategori': 'category', 'fiyat': 'float32'}
8):
9# Filtreleme ve dönüşüm
10filtered = chunk[chunk['fiyat'] > 100]
11df_list.append(filtered)
12
13df_final = pd.concat(df_list, ignore_index=True)
14print(df_final.info())

Sık Yapılan Hata

Chunk'lardan sonra `pd.concat()` kullanırken `ignore_index=True` ekle, yoksa index çakışması yaşarsın. Ayrıca `inplace=True` yerine yeni değişkene ata; inplace işlemler bellek tasarrufu sağlamaz, hatta yavaşlatabilir.

Bu yöntemlerle 10GB dosyayı 500MB bellek ile işleyebilirsin.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz