Gereksinimler ve Ön Hazırlık
Pyarrow kütüphanesini sisteminize kurmak ve büyük veri dosyalarıyla çalışmaya başlamak için Python 3.10 veya daha yeni bir sürümün yüklü olması önerilir. Pyarrow, Apache Arrow projesinin Python arayüzüdür ve C++ tabanlı olduğu için yüksek performanslı bellek yönetimi sunar.
Kurulum için terminalinizde veya komut satırınızda aşağıdaki komutu çalıştırın:
pip install pyarrow pandas
Kurulumun başarılı olduğunu doğrulamak için Python ortamınızda şu komutu çalıştırarak sürüm bilgisini kontrol edebilirsiniz:
import pyarrow as pa
print(f"Pyarrow sürümü: {pa.__version__}")
Bu aşamada, veri setlerinizin Parquet veya Feather formatında olması, Pyarrow'un performans avantajlarından tam olarak yararlanmanızı sağlar. CSV formatı, Arrow'un sunduğu "zero-copy" (veriyi kopyalamadan okuma) avantajlarını tam olarak desteklemez.
Parquet Dosyalarını Pyarrow ile Okuma
Parquet, büyük veriler için endüstri standardı olan sütun tabanlı bir depolama formatıdır. Pyarrow, Parquet dosyalarını okurken sadece ihtiyaç duyulan sütunları belleğe yükleyebilir, bu da RAM kullanımını ciddi oranda düşürür.
Aşağıdaki örnek, büyük bir Parquet dosyasının tamamını veya belirli sütunlarını nasıl okuyacağınızı gösterir:
import pyarrow.parquet as pq
# Parquet dosyasını okuma
table = pq.read_table('buyuk_veri.parquet', columns=['tarih', 'islem_tutari'])
# Verinin ilk 5 satırını görüntüleme
print(table.to_pandas().head())
Bu yöntem, tüm dosyayı belleğe yüklemek yerine sadece belirtilen sütunları seçerek verimli bir okuma gerçekleştirir. read_table fonksiyonu, veriyi doğrudan bir Arrow Table nesnesine dönüştürür.
Bellek Yönetimi İçin "Streaming" (Akış) Yöntemi
Eğer elinizdeki veri seti RAM kapasitenizden daha büyükse, veriyi parçalar halinde (batch) okumak zorundasınız. Pyarrow'un iter_batches yöntemi, veriyi bloklar halinde okuyarak bellek taşmalarını engeller.
import pyarrow.parquet as pq
# Veriyi 10.000 satırlık parçalar halinde okuma
dataset = pq.ParquetDataset('buyuk_veri.parquet', use_legacy_dataset=False)
for batch in dataset.to_batches(batch_size=10000):
# Her bir batch üzerinde işlem yapın
print(f"Okunan satır sayısı: {len(batch)}")
# Örneğin: batch.to_pandas() ile işleme devam edin
Bu yaklaşım, özellikle üretim ortamında (production) çalışan sistemlerde uygulamanızın çökmesini (OOM - Out of Memory hatası) engeller.
Pyarrow ve Pandas Entegrasyonu
Pandas, veri analizi için harika bir kütüphanedir ancak büyük verilerde yavaş kalabilir. Pyarrow'u Pandas ile birlikte kullanarak, veri okuma hızını 5-10 kat artırabilirsiniz. 2026 yılı itibarıyla Pandas'ın read_parquet fonksiyonu, arka planda Pyarrow motorunu kullanmaktadır.
import pandas as pd
# Pyarrow motorunu kullanarak hızlı okuma
df = pd.read_parquet('buyuk_veri.parquet', engine='pyarrow')
# Bellek kullanımı analizi
print(df.info(memory_usage='deep'))
Bu yöntem, veriyi doğrudan Pandas DataFrame formatına dönüştürür ve Arrow'un sunduğu tip optimizasyonlarını (örneğin string yerine dictionary tipi) otomatik olarak uygular.
Veri Formatları Karşılaştırması
Hangi formatı kullanmanız gerektiğine karar verirken aşağıdaki tabloyu referans alabilirsiniz:
| Format | Okuma Hızı | Bellek Verimliliği | Sıkıştırma |
|---|---|---|---|
| CSV | Düşük | Düşük | Yok |
| Parquet | Çok Yüksek | Çok Yüksek | Mükemmel |
| Feather | En Yüksek | Yüksek | Hızlı |
Veri Tiplerini Optimize Etme ve Şema Tanımlama
Büyük verileri okurken veri tiplerini (schema) önceden tanımlamak, Python'un veriyi tahmin etme süresini ortadan kaldırır. Bu, özellikle veri setiniz çok fazla sütun içeriyorsa okuma hızını ciddi oranda artırır.
import pyarrow as pa
# Özel şema tanımlama
my_schema = pa.schema([
('id', pa.int32()),
('kullanici_adi', pa.string()),
('bakiye', pa.float64())
])
# Şema ile okuma
table = pq.read_table('buyuk_veri.parquet', schema=my_schema)
Şema tanımlamak, hatalı veri tiplerinin (örneğin float olması gereken bir sütunun string olarak okunması) önüne geçerek veri kalitesini artırır.
Güvenlik Uyarısı: Dışarıdan gelen Parquet veya Feather dosyalarını okurken dosyaların kaynağına dikkat edin. Kötü niyetli hazırlanmış dosya yapıları, "deserialization" süreçlerinde güvenlik açıklarına yol açabilir. Sadece güvenilir kaynaklardan gelen verileri işleyin.
Sıkça Sorulan Sorular
Pyarrow neden Pandas'tan daha hızlı?
Pyarrow, veriyi C++ seviyesinde sütun tabanlı olarak işler ve bellekteki veriyi kopyalamadan (zero-copy) doğrudan erişim sağlar. Pandas ise genellikle satır tabanlı veya daha yüksek seviyeli Python nesneleriyle çalıştığı için daha yavaştır.
RAM'den büyük dosyaları nasıl okurum?
to_batches veya Scanner API'sini kullanarak veriyi parçalar halinde okumalı ve işledikten sonra bellekten temizlemelisiniz.
Parquet yerine neden CSV kullanmamalıyım?
CSV metin tabanlıdır ve her satırın tiplerini ayrıştırmak için işlemci gücü harcar. Parquet ise ikili (binary) formatta olduğu için doğrudan belleğe aktarılabilir.
Pyarrow ile veriyi filtreleyebilir miyim?
Evet, filter parametresini kullanarak veriyi belleğe almadan önce sadece istediğiniz satırları (örneğin sadece belirli bir tarihten sonrakileri) okuyabilirsiniz.
2026 yılında Pyarrow kullanımı hala geçerli mi?
Evet, Apache Arrow ekosistemi veri mühendisliğinde standart haline gelmiştir ve Pyarrow, Python dünyasında büyük veri işleme süreçlerinin temel taşı olmaya devam etmektedir.
Pyarrow ile Veri İşleme Süreçlerinde Hata Ayıklama ve Performans İzleme
Büyük veri setleri ile çalışırken karşılaşılan en yaygın sorunlar, bellek taşmaları (OOM - Out of Memory) ve beklenmedik veri tipi uyuşmazlıklarıdır. Pyarrow, bu süreçleri yönetmek için düşük seviyeli araçlar sunar. Hata ayıklama sürecinde verinin şemasını (schema) ve meta verilerini (metadata) düzenli olarak kontrol etmek, darboğazları erkenden tespit etmenizi sağlar.
Bellek Kullanımını İzleme ve İstatistik Analizi
Pyarrow'un okuma performansını artırmak için verinin dosya içindeki parçalanma (row group) yapısını anlamanız gerekir. Parquet dosyaları, veriyi bloklar halinde saklar. Okuma sırasında hangi bloğun ne kadar bellek tükettiğini anlamak için ParquetFile nesnesinin metadata özelliğinden faydalanabilirsiniz.
import pyarrow.parquet as pq
# Dosya meta verilerini inceleyerek row group sayılarını kontrol edin
parquet_file = pq.ParquetFile('buyuk_veri.parquet')
print(f"Toplam Row Group Sayısı: {parquet_file.metadata.num_row_groups}")
# Her bir row group'un bellek üzerindeki tahmini yükünü inceleyin
for i in range(parquet_file.metadata.num_row_groups):
rg_metadata = parquet_file.metadata.row_group(i)
print(f"Grup {i} satır sayısı: {rg_metadata.num_rows}")
print(f"Grup {i} toplam bayt boyutu: {rg_metadata.total_byte_size}")
Üretim Ortamında Deployment ve Ölçeklendirme Stratejileri
Pyarrow tabanlı çözümlerinizi canlı ortama taşırken, verinin bulunduğu depolama katmanı (S3, HDFS veya yerel disk) ile işlemci arasındaki I/O (Girdi/Çıktı) dengesini kurmak kritiktir. Özellikle bulut tabanlı depolama servislerinde, veriyi "paralel" okumak, ağ gecikmelerini minimize etmek için en etkili yöntemdir.
Paralel Okuma ile İşlem Hızını Artırma
Pyarrow, çok çekirdekli işlemcilerden tam verim alabilmek için use_threads=True parametresini varsayılan olarak kullanır. Ancak, çok büyük veri setlerini işlerken bu ayarı manuel olarak optimize etmek, sistemin diğer süreçlerini kilitlememenizi sağlar.
import pyarrow.parquet as pq
# Çok çekirdekli sistemlerde okuma performansını optimize etme
table = pq.read_table(
'buyuk_veri.parquet',
columns=['id', 'kategori', 'deger'],
use_threads=True,
pre_buffer=True # I/O hızını artırmak için önbellekleme
)
# Bellek kullanımını düşürmek için tabloyu parçalara ayırarak işleyin
for batch in table.to_batches(max_chunksize=100000):
# Her batch üzerinde işlem yapın
process_data(batch)
Deployment İpuçları
- Sistem Limitleri: Linux tabanlı sunucularda
ulimit -nkomutu ile dosya tanımlayıcı limitlerini kontrol edin. Büyük veri okumalarında çok sayıda dosya açılması gerekebilir. - Bellek Sınırlandırma: Docker konteynerleri kullanıyorsanız,
--memorylimitini Pyarrow'un işleyeceği veri setinin en az 1.5 katı kadar belirleyin. - Tip Dönüşümleri: Bellek verimliliği için
objecttipi yerinecategoryveyaint32/int64gibi sabit boyutlu tipleri tercih edin.
Not: Üretim ortamında, verinin bütünlüğünü doğrulamak için okuma işlemi bittikten sonra table.validate() metodunu kullanarak verideki olası bozulmaları veya şema uyuşmazlıklarını çalışma zamanında yakalayabilirsiniz.
Sonuç
Python ile Pyarrow kütüphanesini kullanarak büyük veri okuma süreçlerini optimize etmek, sadece hız kazanmanızı sağlamaz, aynı zamanda donanım kaynaklarınızı daha verimli kullanmanıza olanak tanır. Bu rehberde öğrendiğiniz Parquet kullanımı, akış tabanlı okuma ve şema tanımlama teknikleri, profesyonel veri hattı geliştirme süreçlerinizde size büyük kolaylık sağlayacaktır.
Sorumluluk Reddi: Bu makalede yer alan kod örnekleri eğitim amaçlıdır. Üretim ortamında büyük veri setleri ile çalışırken, verinin doğruluğunu, dosya izinlerini ve sistemin bellek limitlerini (ulimit) kontrol etmeyi unutmayın. Kodların sisteminizdeki etkilerinden kullanıcı sorumludur.
Bir sonraki adım olarak, Pyarrow ile okuduğunuz verileri DuckDB gibi SQL motorlarına aktararak çok daha karmaşık analitik sorguları nasıl gerçekleştirebileceğinizi araştırmanızı öneririm.


Yorumlar (0)
Yorum Yaz