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.