Arkadaşlar merhaba, uzun zamandır PHP ile projeler geliştiriyorum ama son zamanlarda büyük veri kümeleriyle çalışırken ciddi bir bellek sorunu yaşıyorum. Özellikle bir CSV dosyasından 500 binden fazla satırı okuyup veritabanına yazmaya çalıştığımda, script hafıza limitini aşıp patlıyor. PHP'nin bellek limitini artırmak geçici bir çözüm ama sunucu kaynaklarını da zorluyor, hatta bazen paylaşımlı hostinglerde bu pek mümkün olmuyor. Bu işlemi daha verimli hale getirmek için ne gibi yöntemler kullanıyorsunuz? Örneğin, büyük bir dosyayı parça parça okumak için fgets() veya SplFileObject kullanıyorum ama yine de her satırı döngüde işlerken bellek şişiyor.
Bir de veritabanı tarafında, binlerce satırı tek tek INSERT yapmak yerine toplu ekleme yapmayı denedim, yani tek bir sorguda 1000 satırı birden eklemek. Bu işlemi biraz rahatlattı ama yine de veri kümesi büyüdükçe, özellikle 1 milyon satır civarında, script yavaşlıyor ve zaman aşımına uğruyor. Acaba bu tarz durumlar için generator (yield) kullanmak mantıklı mı? Yoksa PHP'nin dışında bir araç mı kullanmalıyım? Mesela işi arka planda komut satırından çalıştırmak daha mı sağlıklı olur? Siz büyük veri işlerken hangi stratejileri uyguluyorsunuz, deneyimlerinizi paylaşırsanız çok sevinirim.
Ayrıca, bellek kullanımını gerçek zamanlı olarak takip etmek için memory_get_usage() ile log tutuyorum ama sorunun kaynağını tam olarak bulamıyorum. Belki de veriyi işlerken ara bellekte tuttuğum geçici diziler olabilir. Mesela her satırı bir diziye atıp sonra işlemek yerine, satır satır veritabanına yazsam yine de bellek artıyor. Burada bir yanlış yaptığımı düşünüyorum. Yield kullanan arkadaşlar var mı? Gerçekten bellek tasarrufu sağlıyor mu, yoksa sadece yavaşlatıyor mu? Teknik detaylara girmeden, pratikte ne işe yaradığını anlatırsanız harika olur. Herkese şimdiden teşekkürler.
Bir de veritabanı tarafında, binlerce satırı tek tek INSERT yapmak yerine toplu ekleme yapmayı denedim, yani tek bir sorguda 1000 satırı birden eklemek. Bu işlemi biraz rahatlattı ama yine de veri kümesi büyüdükçe, özellikle 1 milyon satır civarında, script yavaşlıyor ve zaman aşımına uğruyor. Acaba bu tarz durumlar için generator (yield) kullanmak mantıklı mı? Yoksa PHP'nin dışında bir araç mı kullanmalıyım? Mesela işi arka planda komut satırından çalıştırmak daha mı sağlıklı olur? Siz büyük veri işlerken hangi stratejileri uyguluyorsunuz, deneyimlerinizi paylaşırsanız çok sevinirim.
Ayrıca, bellek kullanımını gerçek zamanlı olarak takip etmek için memory_get_usage() ile log tutuyorum ama sorunun kaynağını tam olarak bulamıyorum. Belki de veriyi işlerken ara bellekte tuttuğum geçici diziler olabilir. Mesela her satırı bir diziye atıp sonra işlemek yerine, satır satır veritabanına yazsam yine de bellek artıyor. Burada bir yanlış yaptığımı düşünüyorum. Yield kullanan arkadaşlar var mı? Gerçekten bellek tasarrufu sağlıyor mu, yoksa sadece yavaşlatıyor mu? Teknik detaylara girmeden, pratikte ne işe yaradığını anlatırsanız harika olur. Herkese şimdiden teşekkürler.