SevkiBilge

PHP'de büyük veri kümelerini işlerken karşılaştığınız bellek sorunları nasıl çözülür?

TanerYalvacPro
· 3 gün önce · 1 görüntülenme
Arkadaşlar selam, uzun zamandır PHP ile çalışıyorum ve özellikle büyük veri kümelerini işlerken bellek konusunda canımı sıkan bir sorun var. Mesela bir CSV dosyasından 500 bin satırlık veriyi okuyup veritabanına yazarken, veya bir API'den gelen büyük JSON verisini parse ederken, PHP'nin bellek limitini aşıp fatal error almak hiç hoş olmuyor. İşin ilginç yanı, her seferinde memory_limit değerini artırmak da çözüm değil, çünkü sunucuda sınırsız kaynak yok ve sonuçta uygulama yavaşlıyor.

Ben genelde generator kullanarak veya fread/fgets gibi akış tabanlı fonksiyonlarla satır satır işlemeye çalışıyorum, ama yine de bazen veri seti çok büyük olduğunda işler sarpa sarıyor. Özellikle foreach içinde her döngüde yeni bir dizi oluşturmak veya eski verileri temizlemeyi unutmak büyük sıkıntı. Peki siz bu tür durumlarda ne yapıyorsunuz? Mesela işlenen veriyi küçük parçalara bölüp (chunk) işlemek mi daha mantıklı, yoksa unset ile değişkenleri manuel olarak temizlemek işe yarıyor mu?

Bir de merak ettiğim şey, özellikle veritabanı sorgularında büyük sonuç kümelerini fetch ederken PDO'nun unbuffered query yapısını kullanan var mı? Yoksa hala her şeyi bir anda belleğe çekip sonra işlemek daha mı yaygın? Ben genelde buffered sorgu kullanıyorum ama çok fazla satır olunca mysql bile zorlanıyor. Deneyimlerinizi duymak isterim, belki gözden kaçırdığım bir yöntem vardır.
2 yanıt
NadiaSimsekTech
3 gün önce
Abi ben de çok çektim bu dertten. Veriyi tek seferde çekmek yerine chunk chunk işlemek en sağlam çözüm, mesela MySQL kullanıyorsan LIMIT ve OFFSET ile parçala. Bir de generator kullanmayı dene, bellekten yemez, anlık üretir veriyi.
BusraYildiz
3 gün önce
Yıllardır bu işin içindeyim, en can alıcı nokta kesinlikle veriyi tek seferde yüklememek. Generator'lar gerçekten can kurtarıcı, bir de array yerine yield kullanınca bellek kullanımı uçup gidiyor.

Yanıt yazmak için giriş yapın.