PHP İle Büyük Veritabanını Yönetmek / Tekrarlanan Verileri Bulmak / Sorgu Yapmak
12
●512
- 01-09-2022, 12:57:37Metin dosyasında aynı içerik kontrolu yapılabilirmi eklenmeden önce.
Farklı farklı metin dosyaları var ise durum değişir.
Yada farklı bir sunucuda kontrol işlemi gerçekleştirilip yeni bir metin dosyasına yazdırılıp oradan veri ekleme yapılabilir.
Sadece fikir belirtmek istedim nasıl yapılacagı hakkında bir bilgim bulunmamaktadır. - 01-09-2022, 12:58:44Teşekkür ederim hocam, birde konuda bahsetmemişim bir sorum daha olacak,Lyra adlı üyeden alıntı: mesajı görüntüle
Verilerin kaydını yaparken ne var ne yok ise olduğu gibi yüklesem. Daha sonra veritabanında bir sorgu çalıştırarak tekrar eden mail;pass ve user;pass verilerini buldurup silmemiz mümkün mü?
Örneğin 150.000.000 adet veriden 34.000.000 adeti tekrar girilmiş bunları tespit edip silmesi ne kadar uzun sürebilir.
Teşekkür ederim hocam, Metin dosyalarında aynı verilerin tekrar edilmesinin önüne geçebiliyorum fakat son yaptığım kontrolde metin dosyasında 23.000.000 satır veri vardı bunların tekrarlarını temizlerken bile Notepad++ hafiften kafayı yiyor bazen kapanıyor. Bir şekilde metin dosyasının içindeki kontrolü hallediyorum fakat ilerde şöyle bir durum oluşacak.tekcarem adlı üyeden alıntı: mesajı görüntüle
- Metin dosyası 1 için kontrol ettim tekrar veriler silindi ve yüklemeyi yaptım, buraya kadar herşey güzel.
- Diğer gün metin dosyası 2 yi kendi içinde kontrol ettim ve yüklemeyi yaptım, burada sorun başlıyor.
İki dosyada da 20 Milyon veri olduğunu düşünürsek Metin dosyası 1 ve Metin dosyası 2 nin içinde tekrarlanan veriler olması çok büyük bir olasılık iki dosyanın boyutuda çok büyük olduğu için karşılaştırıp tekrar silme işlemi yaptırabileceğimi zannetmiyorum. Vim gibi editörlerde bir yerden sonra sorun yaratacaktır. - 01-09-2022, 13:03:13çok uzun sürebilir. bir veri için bir milyar datayı kontrol etmek mi yoksa bir veri için sürekli artan bir datayı kontrol etmek mi? Tabii ki ikinci. Sürekli bir milyar arasında aramaktansa eklemeden önce araması çok daha performanslı olacaktır.
Ya da hiç insert yapmadan python gibi alternatif bir dil kullanarak bu veri içerisindeki tekrar edenleri silebilirsiniz. Yükü php ve mysqlden almış olursunuz. Çok daha verimli.
bkz: https://stackoverflow.com/questions/...large-datasets
CyBerkeUnal adlı üyeden alıntı: mesajı görüntüle - 01-09-2022, 13:04:03Mail sütunu için, tablonuzda unique index oluşturun.
Insert işleminde aynı kayıt varsa duplicate entry mesajı döndürür ve eklenmesini engeller.
Mesajı verirse işlem durur bu yüzden ignore parametresini insert sorgunuza ekleyin böylece bu içerik var dese bile diğer insert işlemine devam eder
Unique index oluşturma
https://www.mysqltutorial.org/mysql-unique/
Insert ignore kullanım örneği
https://www.mysqltutorial.org/mysql-insert-ignore/
Ayrıca insert işlemini tek tek değil multiple insert olarak yaparsanız dahada hızlandıracaksınız.
https://www.sqlservertutorial.net/sq...multiple-rows/
Milyarlık kayıttan bahsettiniz index için ram ihtiyacınız olacaktır
Ayrıca db partition ilede veritabanını bölümlendirerek daha hızlı insert işlemleri yapabilirsiniz.
Günün sonunda tüm bunların yanında cpu ve ram donanımınızda hız konusunda etkendir. - 01-09-2022, 13:13:11Cevabınız için teşekkür ederim hocam,MCERAN adlı üyeden alıntı: mesajı görüntüle
Mevcut belleğim 16 GB buna bir 16 GB daha eklemeyi düşünüyorum. Ve depolama açısından sorun yaşadığım için M2 SSD almayı düşündüm Okuma/Yazma hızı normal kullandığım SSD'ye göre kat kat fazla olduğu için muhtemelen işlemler azda olsa hızlanacaktır.
Unique index işlemini bende düşündüm fakat şöyle bir sorunumuz doğuyor bu durumda;
berke@R10.Net;berke123
berke@R10.Net;123berke
Yapmak istediğim şey tamamen eşleşen mail;pass verilerinin tekrarını önlemek mail adresi aynı fakat farklı bir şifre içeriyor ise kayıtlar veritabanında tutulmaya devam edebilir.
Normalde Kullandığım Kontrol Aşaması Bu Şekilde;
$query = $conn->query("SELECT * FROM user_pass WHERE data_user = '{$user}' AND data_pass = '{$pass}'")->fetch(PDO::FETCH_ASSOC); if($query) { $tekrarlanan_user_sayi++; echo '<div class="alert alert-danger" role="alert"><b>'.$user.'</b>'.' Kullanıcısı zaten aynı şifre ile veri tabanında kayıtlı, kayıt işlemi yapılamadı.</div>'; } - 01-09-2022, 13:20:38CyBerkeUnal adlı üyeden alıntı: mesajı görüntüle
Şöyle birşey tavsiye edebilirim.
Hash adında bir sütun oluşturun. Bunu üstte belirttiğim gibi unique index yapın.
Mail Ve şifreyi md5 veya güvenilir bir hash metoduyla birleştirin.
Örnek md5($mail.$sifre)
Hash sütununa bunu ekleyin.
Sorgu yaparken hash ile kontrol edin. - 01-09-2022, 13:21:53Onun hakkında şöyle bir düşücem olmuştu hocam veritabanında hiç sorgu çalıştırmamak adına fakat buda yapılabilir bişey mi pek bir fikrim yok, şöyle bir örnek vermek istiyorum,Lyra adlı üyeden alıntı: mesajı görüntüle
Veri dosyası 1.txt 1GB
Veri dosyası 2.txt 890MB
Veri dosyası 3.txt 1.2GB
Bu 3 metin dosyamız daha önceden veri tabanına benzersiz bir şekilde yazdırıldı buraya kadar sorun yok.
Veri dosyası 4.txt 1GB , Bütün satırlar yukarıdaki 3 metin dosyası ile karşılaştırılacak ve tekrar eden satırlar Veri dosyası 4.txt içersinden temizlenecek ya da yeni bir metin belgesi olarak yazılacak. Böylelikle veri tabanında sorgu çalıştırmadan extra yük bindirmeden benzersiz verileri almış olacağım. Fakat 100 adet karşılaştırılacak metin dosyası olduğunu düşünürsek 80GB lık 100 adet metin dosyası ile 1GB metin dosyasını karşılaştırıp ayrıştırmak yapılabilecek birşey mi?