Arkadaşlar merhaba, son zamanlarda üzerinde çalıştığım bir projede PHP ile büyük veri setlerini işlemek zorunda kaldım ve ciddi performans sorunlarıyla karşılaştım. Özellikle 100 binden fazla kaydı bir döngü içinde işlemeye çalıştığımda script ya timeout yiyor ya da bellek sınırını aşıyor. Normalde MySQL sorgularını optimize edip index kullanıyorum ama yine de işler çığırından çıkabiliyor. Bu konuda tecrübesi olan var mı, hangi yöntemleri denediniz?
Ben şu ana kadar birkaç şey denedim: Öncelikle tek seferde tüm veriyi çekmek yerine LIMIT ve OFFSET ile parça parça işlemeyi tercih ettim. Ama OFFSET büyüdükçe sorguların yavaşladığını fark ettim, onun yerine cursor-based pagination daha mantıklı geldi. Ayrıca bellek kullanımını azaltmak için generatör fonksiyonları kullanmayı denedim, özellikle yield ile verileri satır satır işlemek gerçekten işe yarıyor gibi. Yine de bazı durumlarda veritabanı bağlantısını sürekli açıp kapatmak yerine tek bir bağlantıda işlem yapmak mı daha iyi, yoksa her parçada yeni bir bağlantı mı kurmalıyım emin değilim.
Bir de işin içine dosya okuma/yazma girince işler daha da karışıyor. Mesela CSV dosyasından 500 bin satırlık veriyi okuyup işleyeceğim zaman PHP’nin hafızası yetmiyor. Bu noktada fgets ile satır satır okumak işe yarıyor ama yine de işlem hızı düşüyor. Sizce bu gibi durumlarda veriyi doğrudan veritabanına aktarmak mı daha mantıklı, yoksa önce bir kuyruk sistemi (RabbitMQ gibi) kullanarak arka planda işlemek daha mı sağlıklı? Özellikle büyük veri işleme konusunda hangi kütüphaneleri veya araçları önerirsiniz? Tecrübelerinizi merak ediyorum, şimdiden teşekkürler.
Ben şu ana kadar birkaç şey denedim: Öncelikle tek seferde tüm veriyi çekmek yerine LIMIT ve OFFSET ile parça parça işlemeyi tercih ettim. Ama OFFSET büyüdükçe sorguların yavaşladığını fark ettim, onun yerine cursor-based pagination daha mantıklı geldi. Ayrıca bellek kullanımını azaltmak için generatör fonksiyonları kullanmayı denedim, özellikle yield ile verileri satır satır işlemek gerçekten işe yarıyor gibi. Yine de bazı durumlarda veritabanı bağlantısını sürekli açıp kapatmak yerine tek bir bağlantıda işlem yapmak mı daha iyi, yoksa her parçada yeni bir bağlantı mı kurmalıyım emin değilim.
Bir de işin içine dosya okuma/yazma girince işler daha da karışıyor. Mesela CSV dosyasından 500 bin satırlık veriyi okuyup işleyeceğim zaman PHP’nin hafızası yetmiyor. Bu noktada fgets ile satır satır okumak işe yarıyor ama yine de işlem hızı düşüyor. Sizce bu gibi durumlarda veriyi doğrudan veritabanına aktarmak mı daha mantıklı, yoksa önce bir kuyruk sistemi (RabbitMQ gibi) kullanarak arka planda işlemek daha mı sağlıklı? Özellikle büyük veri işleme konusunda hangi kütüphaneleri veya araçları önerirsiniz? Tecrübelerinizi merak ediyorum, şimdiden teşekkürler.