PHP MASİF CSV dosyaları üzerinde yineleme için en iyi uygulamalar

6 Cevap php

Tamam, ben deneyeceğim ve tatlı, bu kısa tutmak ve-nokta.

Biz PHP tabanlı CMS MASİF CSV dosyası yükleyerek bizim sisteme büyük GeolP güncellemeleri yapmak. Bu şey genellikle IP adresi bilgilerinin fazla 100k kayıtları vardır. Şimdi, bu verilerin basit bir ithalat yapıyor hiç bir sorun değil, ama bizim güncel bölgesel IP adresi eşleşmelerinin karşı denetimlerini çalıştırmak zorunda.

Bu bizim, verileri doğrulamak vb çakışan IP adresini karşılaştırın ve bölünmüş. Ve bu kontroller her kayıt için yapılmalıdır gerektiği anlamına gelir.

O, ama sadece diğer satıcılar farklı biçimlerde kendi GeolP güncellemelerini uygulamak için izin verecek bir alan haritalama çözüm oluşturduk değil. Bu CSV güncelleme içinde IP'ler kayıtlara kurallar uygulanarak yapılır.

Örneğin bir kural gibi görünebilir:

'COUNTRYNAME' == 'Avustralya' sonra 'Avustralya IP Pool' göndermek

Çalıştırmak için ve her bir IP kayıt tüm bunları uygulamak zorundadır sahip birden fazla kural olabilir. Örneğin, 10 kurallara karşı denetlemek için 100k kayıtlar, 1 milyon tekrarlamalar olacaktır; eğlenceli değil.

Biz 100k kayıtları için 2 kurallarını buluyoruz işlem 10 dakika kadar sürer. Ben başarılı bir ithalat için gerçekleşmelidir yineleme kayma miktarı burada darboğaz tam olarak farkında değilim; tıpkı diğer seçeneklerin tam olarak farkında değil biz bir şeyleri biraz hızlandırmak zorunda kalabilirsiniz.

Birisi parçaları, sunucu tarafına dosya bölme önerilir. O zaten karmaşık bir sistemin henüz karmaşık bir katman ekler gibi bu kalıcı bir çözüm olduğunu düşünmüyorum. Dosyası ayrıştırılır ve bölünmüş açılmış olması gerekir. Sonra komut yanı sıra parçalar üzerinde yineleme gerekir.

Yani, soru, ne iyi yöntem biraz bu süreci hızlandırmak olacaktır, ben sadece ne yazdı düşünüyor? SADECE bu araç için sunucunun donanım yükseltme maalesef bir seçenek değildir, ama onlar ile başlamak oldukça yüksek-uç kutuları demektir.

Düşündüğüm gibi kısa, ama evet değil. Halps? (

6 Cevap

Bir veritabanı (SQL Server adlı kullanıyorum) içine bir toplu ithalat gerçekleştirin. BULK IMPORT anlamıyla saniye sürer ve 100.000 kayıt iş kurallarına crunch bir veritabanı için fıstık. Ben düzenli olarak 4 milyon satır ile bir masaya benzer bir veri egzersizi yapmak ve listelenen 10 dakika almaz.

EDIT: Ben işaret olmalıdır, evet, ben bunun için PHP önermiyoruz. Bir DATABASE kullanmak, çiğ DATA ile uğraşıyoruz ..: P

Bu kadar basit anahtar mümkün olduğunca iç döngü dışarı kadar iş tutuyor.

Basitçe söylemek gerekirse, iç döngü içinde yapacağınız her şey bu kadar hiçbir şey yapmadan, "100K defa" yapılır, en iyi (ama kesinlikle pratik değil) bu yüzden mümkün olduğunca az yaparak sonraki en iyi bahistir.

Örneğin, bellek, ve bu uygulama için pratik ise, ana işlem sonrasına kadar herhangi bir "çıktı" erteleyebilir. Pratik yanı sıra eğer herhangi bir giriş verileri önbelleğe. Bu özet veri veya ara sıra veri için en iyi çalışır.

İdeal olarak, ana işlem sırasında mümkün olduğunca az I / O yapmak, CSV dosyasının okunması için kaydedin.

PHP Unix mmap tesis için herhangi bir erişim sunuyor mu, o tipik dosyalarını okumak için en hızlı yolu, özellikle büyük dosyaları.

Başka bir göz toplu için ekler olduğunu. Örneğin, basit dizeleri olarak INSERT deyimleri oluşturmak, ve 10, 50, veya 100 satır blokları sunucuya gemi basittir. Çoğu veritabanı (64K, ya da bir şey gibi) SQL deyiminin boyutu biraz sert sınırı var, bu yüzden akılda tutmak gerekir. Bu dramatik DB için tur gezileri azaltacaktır.

Basit adımlarla yoluyla birincil anahtarları oluştururken ediyorsanız, yaptığınız kitlelerin (1000 blokları, 10000, ne olursa olsun) tr. Bu sizin iç döngü kaldırmak başka bir şeydir.

Ve emin, aynı anda her satır için tüm kuralları işleme olmalı, ve her bir kural için kayıtları aracılığıyla çalıştırmak değil.

Deneyebilirsiniz bir şey komut satırı PHP altında CSV içe çalışıyor. Bu genellikle daha hızlı sonuçlar sağlar.

Eğer, bu işi yapmak bu konularda PHP daha YOL daha hızlı olduğu için Python ayrıştırma geçmek için PHP kullanıyorsanız, bu değişim% 75 ya da daha fazla sürecini hızlandırmak olmalıdır.

Eğer siz de LOAD DATA INFILE operatörünü kullanabilirsiniz MySQL kullanıyorsanız size rağmen veritabanına eklemeden önce verileri kontrol gerekiyorsa, emin değilim.

Ben çok geç olabilir, ama bir arka uç olarak hareket etmek bir derlenmiş özgün dilinde bir uygulama yazıyorum kabul var? Ayrıca, ben kodunuzu görmedim ama o kadar uzun sürer eğer açıkça verilerinizi yönetmek nasıl yanlış bir şey yapıyorsun.

100k kayıtları büyük bir sayı değildir. 10 dakika tek bir iş parçacığı için kötü bir iş işleme zamanı değil. Düz bir hat yapılacak ham iş miktarı, muhtemelen yaklaşık 10 dakika olduğunu, bunu daha hızlı olmasını istiyorsanız PHP veya C kullanıyorsanız olursa olsun, bir süre döngü daha karmaşık bir çözüm ihtiyacımız olacak .

İşte ben bunu çözecek nasıl:

  1. Haritayı kullanmak / paralel işlemini çalıştırmak için çözüm azaltmak. Hadoop muhtemelen overkill olduğunu. Domuz Latin işi yapabilir. Siz gerçekten sadece haritanın harita parçası / sorun azaltmak istiyorum. IE: Bir alt süreç tarafından işlenecek dosyanın bir öbek bölmek konum. Sizin redüktör muhtemelen cat. Basit bir sürümü yeniden monte onların çıkış sonra, çocuklar için beklemek, her 10K kayıt yığın için PHP çatal süreçleri sahip olabilir.
  2. Bir kuyruk / ızgara işleme modeli kullanın. Dosyanın parçalarını sıraya, sonra, kontrol işleri kapma ve yere veri gönderme makineleri bir küme var. Bu harita / sadece farklı teknolojiler kullanarak, modeli azaltmak için çok benzer, artı şebekeye daha fazla makineleri ekleyerek ölçek olabilir.
  3. Eğer SQL gibi mantığı yazabilirsiniz, bir veritabanında bunu. Çoğu web programcıları bu seviyede SQL ile çalışmak değil, çünkü ben bu önleyeceğini. Ayrıca, SQL tür RBL çek veya ARIN aramalarını gibi şeyler yapıyor sınırlıdır.