Python ve Mysql Hiz Problemi

Elimde icerisinde yaklasik 50 milyon civarinda satir bulunan bir txt dosyasi var verileri split edip istedigim sekilde satir satur okuyarak bunlari mysql tabloma ekliyorum ancak bu sekilde gercekten uzun suruyor daha once thread kullanarak bir program yazmamistim.Sanirim thread kullanarak bunu hizlandirmam mumkun o konuda sizden yardim istiyorum.Aslinda ugrassam yaparim gibji geliyor ama aklima takilan bir sorunu bir turlu cozmek icin bir fikir gelmedi aklima sorun suki veri tabaninan ekledigim bir satiri programin tekrar eklemesini istemiyorum yani zaten var olan bir satiri eklememesi lazim bunun icin veri tabaninda sorgulama yapabilirim sanirim eklemeden once ancak buda programin tekrar yavaslamasina sebep oluyor.Bana bu sorunu hiz kaybetmeden cozmek icin bir fikri olan varmi.

Aklima gelen ilk yontem txt dosyasini milyon satirilik 50 parcaya bolmek geldi ancak satir satir bolmem gerekiyor yabi hic bir satiri atlamadan bunu nasil yapabilirm bilen varsa buda isimi gorecektir sanirim.

Merhaba.

threading modülü ile 50 tane thread oluşturup her thread’e 1 milyon satırı emanet edebilirsiniz. Böylece her thread eşzamanlı olarak kendi sorumluluğundaki satırları veritabanına ekler.

Aslında threading modülü ile sağladığınız eşzamanlılık gerçek bir eşzamanlılık değil; eğer bilgisayarınızda 4 işlemci çekirdeği varsa bunların 4’ünden de faydalanamazsınız. Çünkü Python’da GIL(Global Interpreter Lock) diye bir kavram var ve bu, Python programlarının birden fazla CPU’da eşzamanlı olarak çalışmasını engelliyor. Ancak subprocess modülü ile bunu sağlayabilirsiniz. threading modülünün aksine bu modül işletim sistemi seviyesinde çalışır ve işletim sistemi işlemleri(process) oluşturur. Bu işlemler birden fazla CPU’yu aynı anda kullanabildikleri için CPU çekirdeklerinden tam olarak faydalanabilmiş olursunuz.

İyi çalışmalar.

o kısmı az çok anladım ancak 50milyon satır içinde mesela 2 milyonununcu satırı direk okumak için ne yapmam gerekecek orayı çözemedim.Bir enum nesnesi oluşturup o şekilde erişmeye çalışacağım


for i,line in deneme:
	if i==25:
		print(line)

o sorunu da şöyle bir kod ile çözdüm burdaki deneme değişkeni bir enum nesnesi tekeşşürler şimdi threadleri yazabilirim :smiley:

Konuya bir ek yapayim enumerate fonksiyonunubkullandigimda orjinal kodumun bariz sekilde hizlandigini gordum cok faydali oldu benim icin gercekten cok islevsel

range fonksiyonunu da kullanabilirsiniz:

>>> for i in range(0, 5000000, 100000):
...     print(i)
...
0
100000
200000
300000
400000
500000
600000
700000
800000
900000
1000000
1100000
1200000
1300000
1400000
1500000
1600000
1700000
1800000
1900000
2000000
2100000
2200000
2300000
2400000
2500000
2600000
2700000
2800000
2900000
3000000
3100000
3200000
3300000
3400000
3500000
3600000
3700000
3800000
3900000
4000000
4100000
4200000
4300000
4400000
4500000
4600000
4700000
4800000
4900000

Cok tesekkur ederim verileri tabloya aktardim ancak bu defa da sorgular cok yavasladi web uygulama eklersem bu halde pek islevsel olmaycaktir.Sorun cozdukce sorunla karsilasiyorum.tabloda 50 milyona yakin veri olmasindan kaynaklaniyor sanirim bunada bir cozum bulmamam gerekecek.

Hız problemini çözmek için birkaç şey deneyebilirsiniz:

  • Veriyi dizinlemek.
  • Sorguları eniyilemek.
  • MySQL’in hızlandırma ipuçlarını araştırmak.
  • Oracle gibi daha hızlı bir veritabanı kullanmak.
1 Beğeni

Oracle icin lisan ucreti odemem gerekiyor yanilmiyorsam o is icin sponsor bulmam lazim.Ama diger yontemleri arastiracagim tesekkur ederim.

1 Beğeni

50 veya 500 tane veritabanına ayırıp sqlite de kullanabilirsiniz. :slight_smile:

o çok uğraştırır o işlevsel değil benim için.

Ama hız konusunu düşünecek olursak 1 milyon veya 100 bin satırı aramak mı yoksa 50 milyon satırı aramak mı?

Bence bu hız sorununu çözmez. Çünkü yine her veritabanına bakılması gerek. Ayrıca fazladan karmaşıklık da eklenecektir projeye.

1 Beğeni

Biraz uğraştırıcı fakat 50 threading kullanarak sonuca daha hızlı ulaşılabilir. Ayrıca bu işlem için bir fonksiyon yazılırsa hiçbir karışıklık olmaz.

Merhaba.

Bunu biraz açabilir misiniz?

Böyle bir fonksiyon için aklınızda bir algoritma var mı? Bence bu fonksiyonu yazması kolay olmaz.

İyi çalışmalar.

Yapılmayacak bir şey için yaptığımız bu tartışma uzayıp gidiyor. Büyük bir ihtimalle arkadaş işini mysql kullanarak yapmıştır. O yüzden uzatmanın lüzumu yok.

1 Beğeni

Merhaba.

Tartışmak tamamen benim merakımdan kaynaklı. Tartışmaya girmek niyetinde değilseniz, gönderilerinizde tartışmaya açık savlar kullanmamanızı tavsiye ederim. :wink:

İyi çalışmalar.

1 Beğeni

Mesele tartışmaya girmemek değil boşa tartışmak. Tartışacaksak birilerinin işine yarayacak bir konu için tartışalım.