Challenge ! (Meydan Okuma)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

Bazı yabancı sitelerde görmüşsünüzdür; challenge (meydan okuma) başlıkları altında programcıların eğlenmek, eğlenirken öğrenmek için yarışma havasındaki paylaşımları olur. Ben de araştırmayı seven arkadaşlarım için bir challenge açmak istedim burada.

Konu: 1 GB boyutunda bir dosya açılacak ve bu dosyanın içi 123456789 sayıları ile doldurulacak. Ardından dosyadaki her 123456789 ters çevrilip 987654321 olarak kaydedilecek.

Kısıtlar:
1- Uygulamanın ana thread'inden başka thread kullanılamaz. (CreateThread yada TThread sınıfını kullanmak yasak)
2- Uygulama tüm bu işlemleri yaparken responsive durumda olacak, yani kilitlenme yaşanmayacak. (İşlemleri bir başka thread'de yapıyormuşuz gibi)
3- Kullanıcı işlemi istediği an sonlandırabilecek.

Gerekir ise ipucu verilebilir fazla olmamak kaydı ile ;)
En son thelvaci tarafından 26 Eki 2015 08:40 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge !

Mesaj gönderen thelvaci »

Tabii, maksat öğrenmek ve öğrenmek isteyenlere kapı aralamak olduğu için burada beyin fırtınası yapmak; mevcut yöntemler hakkında tartışmak yasak değil :) Bilakis istenen ;)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen mrmarman »

Kıstasları biraz açalım istersen hocam.
A. 1GB dosya peşin olarak zerofill veya null olarak mı açılacak.
B. Uygulama sizin tarafınızdan test edilip aynı referans sistemde en hızlı olanı mı sıralamayı verecek. Çünkü herkes bunu yapacaktır, farkı kullanılan algoritma oluşturacaktır. (filestream, blockwrite, memorystream to file stream vsvs.)
C. 1..9 içerik geri çevrilirken ifade ettiğiniz aslında text dosya reverse edilecek de içeriğin 9..1 oluşu bu işlemin sağlaması mıdır?
Resim
Resim ....Resim
seci20

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen seci20 »

keşke bende sizin gibi iyi bilsemde katılsam hocam :/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen mrmarman »

Bu araştırmaya sevk ediyor @seci20
Fiziksel bir dosya oluşturma konusunda TFileStream konusunu bir incelersen sana bu projenin %80'i konusunda işlemi tamamlatacaktır.

Örneğin :

Kod: Tümünü seç

Var
  strDosyaAdi  : String;
  FizikselDosya: TFileStream;
begin
  strDosyaAdi  := ExtractFilePath(Application.ExeName) + 'dosya.txt';
  FizikselDosya:= TFileStream.Create( strDosyaAdi, fmCreate );
  // buraya kadarı bile dosyayı (0) byte halinde create etti.
  // Proje klasöründe EXE'nin yanına gidip bakabilirsin.
  FizikselDosya.Free;
end;
Geriye FizikselDosya içini ne şekilde ve nasıl dolduracağımız ile ilintili.

Şimdi asıl konu bizden beklenen hız mıdır yoksa (1) karakter (1) karakter doldururuz, veya (100) KB'lık bir karakter blok oluşturup bunları top top doldururuz vs. sorunun birazcık esnemesi gerekiyor. :)
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

Üstadım, biraz daha açayım o halde müsaadeniz ile; ilk olarak dosyanın kesin olarak 1 GB = 1024 MB * 1024 KB * 1024 Byte = 1.073.741.824 byte olması gerekiyor. Öncelikle dosyanın içini 123456789'lar ile dolduracağız; ardından ters çevireceğiz. Son ahvalde dosya içeriğinde 987654321'ler görünüyor olacak. Ancak burada dikkati çekmek istediğim nokta; uygulamanın ana thread'i kesinlikle bloklanmamalı. Bahsedilen, FileStream, BlockRed/Write metodları ana thread'i işleri bitene kadar bloklayacaktır ;) Biz bunu istemiyoruz, sorunun amacı da bu zaten.

Burada arkadaşlarımız; 7 adet Win32 api ile haşır neşir olacaklar ;) Hadi bakalım fırtınaya devam, gerçi henüz fırtına oluşmamış hafif bir esinti var sanki :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

Bu arada hız çok da önemli değil, zaten sorunun amacına hizmet eden kodu yazabildiğiniz zaman normal hızdan biraz daha yavaş olduğunu gözlemleyeceksiniz arkadaşlar. Maksat ana thread'i bloklamadan işlem yapmak daha önce de dediğim gibi; ama tabii bunu yaparken 10K bilgi yazayım/okuyayım ardından da bir Application.ProcessMessages çakayım yöntemi de kabul edilmiyor bilginize :)
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen xozcanx »

Çok güzel bir fikir ortaya koymuşsunuz. Umarım gerekli ilgiyi görürde bizler içinde iyi bir makale ve kaynak oluşur burada :bravo: :bravo: :bravo:
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

xozcanx yazdı:Çok güzel bir fikir ortaya koymuşsunuz. Umarım gerekli ilgiyi görürde bizler içinde iyi bir makale ve kaynak oluşur burada :bravo: :bravo: :bravo:
Öneri ve fikirlere de açığız; burada aklınıza gelenleri de paylaşabilirsiniz. Olurunu/olmazını bilgimiz dahilinde dilimiz döndüğünce izah etmeye çalışırız biz de ;)
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen SimaWB »

Öncelikle itirazım var: Böyle güzel bir fikrin mesai saatleri içerisinde uygulanması hiç hoş olmadı. Haksız rekabet var :D :D :D
thelvaci yazdı:ama tabii bunu yaparken 10K bilgi yazayım/okuyayım ardından da bir Application.ProcessMessages çakayım yöntemi de kabul edilmiyor bilginize :)
10K değilde, sadece 9 Byte datayı ("123456789") döngü içinde, Application.ProcessMessages kullanarak yazarsak donma olmaz diye düşünüyorum.
Tekrar bir döngü ile bu sefer de "987654321" yazdırırsak sorun çözülmüş olur :)
There's no place like 127.0.0.1
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

SimaWB yazdı:Öncelikle itirazım var: Böyle güzel bir fikrin mesai saatleri içerisinde uygulanması hiç hoş olmadı. Haksız rekabet var :D :D :D
thelvaci yazdı:ama tabii bunu yaparken 10K bilgi yazayım/okuyayım ardından da bir Application.ProcessMessages çakayım yöntemi de kabul edilmiyor bilginize :)
10K değilde, sadece 9 Byte datayı ("123456789") döngü içinde, Application.ProcessMessages kullanarak yazarsak donma olmaz diye düşünüyorum.
Tekrar bir döngü ile bu sefer de "987654321" yazdırırsak sorun çözülmüş olur :)
Yoook o şekilde de yasak :) API ile çözmeniz gerekecek, bu destek Delphi ile sunulmuyor(hazır sınıflar ile), bu da bir ipucu olsun madem ;)
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen xozcanx »

Çok iyi bir yerden, sizinde çok iyi hakim olduğunuz bir konudan başlamışsınız.Konular takipte ;)
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen sadettinpolat »

Tugrul abi https://msdn.microsoft.com/en-us/librar ... s.85).aspx
bu adrestekilerle bi alakasi var mi yoksa tamamen yanlis yolda miyim :)
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen thelvaci »

sadettinpolat yazdı:Tugrul abi https://msdn.microsoft.com/en-us/librar ... s.85).aspx
bu adrestekilerle bi alakasi var mi yoksa tamamen yanlis yolda miyim :)
Çok doğru yoldasın Sadettinim ;)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge ! (Meydan Okuma)

Mesaj gönderen G.Arkas »

Harika bir şey yaptınız Tuğrul hocam. Konu çok şahane.

Muharrem abi ipucu yerine direk cevabı vermiş ama olmaz ki. :oops:

Bir ara lazım olduğundan MemoryMappedFile kullanmıştım. Sanırım buradan yola çıkabilirim. Ama emin değilim. Dosyayı Memory'de oluştursam işlem bittikten sonra fiziksel olarak kaydetsem olur mu?
Resim
Cevapla