Python kaynak duruma göre işlem yönetimi

Anladım, benim aklımda şöyle bir şey vardı. data 1 denilen şey için harcanacak kaynak miktarı ile data 2 denilen şey için harcanacak kaynak miktarı aynıysa, programın kullanacağı hafızayı data'ya göre belirleyip çalıştırabiliriz. Limit aşıldığında program durur, bir süre beklenir ve tekrar çalıştırılır ve kalan data için de aynı işlemler tekrar eder. Şu an sadece teorik olarak söylüyorum bunları.

evet bütün datalar için kullanılabilecek maksimum bellek miktarı aynı ve CPU thread miktarını ben belirliyorum. dediğin gibi yapmak gerekiyor ancak durdurup başlatma için hangi kütüphaneyi kullanmam gerekiyor bilmiyorum

Bir ara çok da benzer olmayan ama yine de yığın miktarı ile alakalı bir sorunla karşılaşmıştım. Şöyle söyleyeyim. 60000 insanın astrolojik harita dağılımlarını hesaplamaya çalışıyordum. Sadece tek bir insan için oluşacak dağılımdaki sayısal veriler ile karakter verilerinin kaplayacağı hafıza kendi başına zaten hatırı sayılır bir kaynak tüketiyordu ve veriler tamponda bekletiliyordu. 60000 veri için bu dağılımları program hesaplayamıyordu. Veri sayısını 10000 yapsam bile program hafızayı tüketiyordu. Algoritmama baktım, üstünde düşündüm. Kullanabileceğim en geçerli algoritmanın bu olduğu sonucuna vardım. Sonra bu sorunu nasıl çözerim diye düşündüm, aklıma bir yol geldi. İnsan sayısı 400 ve katlarına eriştiğinde program tamponda bekletilen verileri alacak bir excel dosyasına yazacak. Zaten bütün verilerin sonucu excel dosyasına yazılacaktı. Sonra 400’den 800’e kadar olan veriler alınacak bu sefer başka bir excel dosyasına yazılacak. Böyle böyle 150 tane dosya oluştu. Ve başka bir kod yardımıyla bu 150 excel dosyasının verilerini birleştirdim. Ve böylece bu sorun çözülmüş oldu. Bu yöntem sizin durumunuzda işe yarar mı peki?

yok hayır bu şekilde bi çözüm benim sorunumu çözmez

Bu komutlara ornek var mi? Hangi program cagriliyor? Hangi isletim sisteminde?

Komutlar subprocess gibi bir modulle baska process’te cagrilacagi icin Python scripti icindeki multiprocessing yontemi onemli degil.

  1. komutun ciktisi olmadan 2. komut nasil baslayacak?

Data nedir? Data seti nedir? Bir adet data ne demek? (Data’nin latince “veriler” demek oldugunu hatirlatmak isterim.)

Isin bolunebildigi en ufak parcayi tanimlamak lazim. Kac thread istiyor, ne kadarda bitiyor, ne kadar hafiza kullaniyor, diger hangi parcalari gerektiriyor.

Henuz isin bolunebilecegi parcalar cikmamis. (Anlatmayi/anlamayi kolaylastiracak derecede belirgin bir sekilde.)

Bu parcalar arasindaki gereksinim iliskileri de cikmamis. (Keza)

1 Beğeni

bir biyoinformatik pipeline yönetimi için kontrolcu script yazmak amacım kullanılan OS linux çağrılan programlar bwa samtools gatk ensembl-vep

kontrolcu olan script python olacağı için tetiklemeleri kaynakların durumuna göre yapmak gerekiyor

bu komutlar dizini şu şekilde işliyor
A B ve C olmak üzere ayrı 3 tane bireyimiz var ve bu bireylerin her birinin 2 tane olmak üzere fastq formatında verileri var ilk basta A bireyine ait 2 fastq dosyasını alıp 16 komuttan adım adım geçiriyoruz. sonra B için ve C için aynı işlemler yapılıyor ancak bunlar arka arkaya yapılacak olursa hem ram baya bir boş kalmış oluyor hemde zaman kaybı yaşanıyor ancak A B ve C bireylerinin yapılması gereken işlemleri aynı anda başlatılır ise 1 bireyin işlenebileceği sürede 3 birey işlenmiş olucak. burda bahsettiğim paralel olarak işleme alındığında A bireyi için komutlar sırayla çalışacak B bireyi içinde C bireyi içinde aynı şekilde yani hiç bir bireyin verisi diğerinin verisini etkileyen bir şey değil

benim çözmek istediğim olayda şu hali hazırda 3 tane bireyin işlemleri başladığında diyelim ki 4. bir bireyin daha verisi bulunuyor bu 4. bireyin verilerini işleme alıcak kadar bellek ve cpu alanı bulunuyor mu bunu kontrol etmek (bunu hallettim) daha sonrasında diyelim 4 bireyde 1. komutu bitidiler ancak 2. komut için 3 bireylik bellek bulunuyor o zaman 4. bireyi askıya alıp 3 bireyin çalışılması ve daha sonra uygun durum oluştuğunda 4. bireyinde 2. komutunu çalıştırmak istiyorum.

Bunun ideal cozumu bir dependency graph olusturmak. DAG turunde olan bu graph’in ucundaki vertex’ler (sink vertex) calistirilabilir isler. Isi biten vertex’ler ciktikca ucta yeni vertex’ler kaliyor, onlar calisiyor, onlar bitince siliniyor, yenileri uca cikiyor… Sonunda son islerin hepsine depend eden bir vertex kaliyor.

Biraz daha kolay bir versiyonu hacky bir sekilde yapilabilir: Birbirinden bagimsiz N birey oldugunu biliyoruz ve bireylerin dependency’leri cizgisel. Her birey icin “calistirilabilen isi al” denilip toplandiginda calistirilabilecek islerin listesi cikar.

Kaynak dagilimi icin bir karar mekanizmasi gerekiyor; 10 CPU varsa (3, 3, 2)'lik 3 is calisip 2 CPU bosta mi kalmali yoksa (4, 5)'lik 2 is calisip 1 CPU bosta mi. Benzer sekilde RAM kullanimi…

Bunun da kolay yolu “1. seviye is calisabiliyosa calissin, yoksa 2’lere bakalim” gibi bir sey olabilir, gerektikce komplikelestirilir.

1 Beğeni

sevgili @aib bunu python ile nasıl kodlayabiliriz peki?

Python kodlamayi ne kadar biliyoruz?

Islerin kaynak ve girdi gereksinimlerini siniflarda soyutlayabiliyor muyuz? Komutlari hal-i hazirda calistirabiliyor, bittiklerinde ogrenebiliyor muyuz?

evet aktif olarak python kodlayabiliyorum class ve inheritance yapısı kurabiliyorum @aib

O zaman

while butun_isler_bitmedi():
    calisabilir = calistirilabilir_isleri_al()
    calisacak = calistirilacak_isi_sec(calisabilir)
    calistir(calisacak)
    sleep(120)

Dedigim gibi, calistirilabilir_isleri_al her bireyin calismayan ilk isini dondurebilir, calistirilacak_isi_sec de kaynak kullanimina gore islerden birini, sifirini veya birden fazlasini secerek dondurebilir.

1 Beğeni

@aib while döngüsüne condition olarak bir fonksiyonu mu vericem tam olarak anlamadım

İşlemlerin bitip bitmediğini True veya False olarak döndüren bir fonksiyon while döngüsünün koşulu olabilir.

Hmm, sorudan yola cikarak; bekledigimden daha zor olabilir, burada beraber yazmamiz gerekebilir.

1 Beğeni

tabiki de ben yarın kodu yazmaya başladıktan sonra karşılaştığım sorunları bu post altında sorarım beraber çözebildiğimiz kadar çözeriz :slight_smile: teşekkür ederim yardımlarınız için arkadaşlar @aib @dildeolupbiten @EkremDincel