Yeterince çekirdek yedim.
Şimdi bir kaç ipucu vermeye çalışayım.
Aslında konuyu elimizde çok fazla veri var dediğinizde;
Aslında sorunu doğru tanımlamak çözümün yarısı olmuştur demek yetmez. Sorunu doğru tanımlarsanız çözüm de kendiliğinden gelir.
Elinizdeki iki parçalı dosyaları öncelikle birleştirin. Ayrı ayrı parçalar halinde tutmanızın hiç bir anlamı yok.
Sonra verilerinizi sıralayın.
Her türlü karşılaştırma algoritmasından öncelikle verileri sıralamak size arama algoritmalarını uygularken fayda sağlayacaktır.
Yani bazı değerleri aramaya dosyanın en başından başlamanıza gerek kalmayacak hızda artış sağlayacaktır.
Eğitimlerde ve çeşitli kurslarda arama algoritmaları anlatılırken öncelikle sıralama algoritmaları öğretilir, çünkü sıralanmış bir veri üzerinde arama yapmak daha kolaydır.
Bu nedenle itereasyon sayınızın fazlalığını hatırlattım.
10 milyon x 10 bin x karşılaştıracak dosyadaki kayıt sayısı konusu bundan önemli.
Ama sıralanmış bir dosyada ikili arama (binary search) yaparsanız, iterasyon sayısı azalacaktır.
Bu anlamlı miktarda hızda iyileşme sağlayacaktır.
Ama asıl burada hızı etkileyen faktör, dosya okuma yazma zamanlarıdır.
Dosya okuma zamanlarını azaltmak tartışmaya açık bir konu. Normal bir sabit diskte (HDD) sıralı erişim dışında bir şansınız olmadığından, okuma yazma konusunda çoklu process yada çoklu işlemenin bir faydası olacağını düşünmüyorum.
Canım sıkıp da bu konuda performans analizi yapar mıyım, belki analiz etmek eğlenceli olabilir.
Ama belki SDD lerede çoklu erişimin bir yolu var mıdır diye de şöyle bir literatüre bakıyorum. (ReadFileScatter anahtar aranacak kelimeniz olsun.)
Dahası, TXT dosyalar, ikili dosylar gibi olmadıklarından gereğinden fazla yer kalplıyor, aslında dosyaları binary olarak kaydetmek daha az yer kaplamalarını sağlayacaktır.
Bir de Windows işletim sistemi, dosyaları, dosyaların belirli bir miktarını sayfa sayfa açıp işleme olanağı sağlayan, api ler sağlar.
File Mapping - Win32 apps | Microsoft Docs
Bu arada, temel bazı kuralları da buraya bırakayım.
Speed Up Python Code | LoginRadius Blog
Mesela for döngülerinden uzak durun, kütüphanlerden faydalanın, çoklu atamaları kullanın, while döngüsünde True yerine 1 kullanın, gibi bir çok basit kural da ufak tefek faydalar sağlar.
Özetle toparlarsak.
Öncelikle dosyalarınız büyükten küçüğe yada küçükten büyüğe bir sıralayın.
Sorting a text file alphabetically (Python) - Stack Overflow
Şu iki parça halindeki 1 ve 2 nolu dosyalarınızı önce binary bir dosyaya birleştirin. Metin dosyaları çok yer kaplıyor.
Python Read A Binary File (Examples) - Python Guides
Gibi bir yerden kullanımlarına bakabilirsiniz.
Ardından dosya karşılaştırmak için şu an kullandığımız metod yerine ikili arama algoritmalarını araştırın.
Bu sayede;
Dosyalar az yer kaplar, arama işlemi daha az iterasyon içerir.
Bunlara rağmen de süre uzun gelirse,
Bu durumda file mapping ile dosyanın belirli kısımlarını ayrı ayrı processlere dağıtıp aramayı eş zamanlı hale getirmeyi deneyebiliriz.
Lafla peynir gemisi yürüttüm.
Kodlarken başımıza ne gelir bilemem.
Fikirlere açığım.
Son bir not daha. Sizin kullandığınız, bit coin kütüphanesi keyleri ne kadar süre tüketerek oluşturuyor onları da ayrıca incelemek gerekebilir.