Challenge ! (Meydan Okuma)
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Challenge ! (Meydan Okuma)
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
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.
Re: Challenge !
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
Re: Challenge ! (Meydan Okuma)
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?
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?
Re: Challenge ! (Meydan Okuma)
keşke bende sizin gibi iyi bilsemde katılsam hocam :/
Re: Challenge ! (Meydan Okuma)
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 :
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.
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;
Ş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.
Re: Challenge ! (Meydan Okuma)
Ü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
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
Re: Challenge ! (Meydan Okuma)
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
Re: Challenge ! (Meydan Okuma)
Ç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
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Re: Challenge ! (Meydan Okuma)
Ö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 dexozcanx 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
Re: Challenge ! (Meydan Okuma)
Öncelikle itirazım var: Böyle güzel bir fikrin mesai saatleri içerisinde uygulanması hiç hoş olmadı. Haksız rekabet var
Tekrar bir döngü ile bu sefer de "987654321" yazdırırsak sorun çözülmüş olur
10K değilde, sadece 9 Byte datayı ("123456789") döngü içinde, Application.ProcessMessages kullanarak yazarsak donma olmaz diye düşünüyorum.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
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
Re: Challenge ! (Meydan Okuma)
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 mademSimaWB yazdı:Öncelikle itirazım var: Böyle güzel bir fikrin mesai saatleri içerisinde uygulanması hiç hoş olmadı. Haksız rekabet var
10K değilde, sadece 9 Byte datayı ("123456789") döngü içinde, Application.ProcessMessages kullanarak yazarsak donma olmaz diye düşünüyorum.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
Tekrar bir döngü ile bu sefer de "987654321" yazdırırsak sorun çözülmüş olur
Re: Challenge ! (Meydan Okuma)
Ç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..
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Challenge ! (Meydan Okuma)
Tugrul abi https://msdn.microsoft.com/en-us/librar ... s.85).aspx
bu adrestekilerle bi alakasi var mi yoksa tamamen yanlis yolda miyim
bu adrestekilerle bi alakasi var mi yoksa tamamen yanlis yolda miyim
Re: Challenge ! (Meydan Okuma)
Çok doğru yoldasın Sadettinimsadettinpolat yazdı:Tugrul abi https://msdn.microsoft.com/en-us/librar ... s.85).aspx
bu adrestekilerle bi alakasi var mi yoksa tamamen yanlis yolda miyim
Re: Challenge ! (Meydan Okuma)
Harika bir şey yaptınız Tuğrul hocam. Konu çok şahane.
Muharrem abi ipucu yerine direk cevabı vermiş ama olmaz ki.
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?
Muharrem abi ipucu yerine direk cevabı vermiş ama olmaz ki.
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?