Forum: Projeler dkv RSS
std.stream çok mu hatalı(kırılgan) yoksa sorun bende mi ?
canalpay (Moderator) #1
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Subject: std.stream çok mu hatalı(kırılgan) yoksa sorun bende mi ?
Normal bir şekilde çalışan kodları tekrar çalıştırdığımda(Kodlara ellemedim diye hatırlıyorum.) şu şekilde hata verdi:
std.stream.OpenException: Cannot open or create file 'dene/deneöe/dem.dkv'

Önceden benchmark şablonu ile hız testi yaptığımda da böyle hatalar veriyordu. örneğin 100 kere çalıştır dediğinde hata vermiyor ama 10000 kere çalıştır dediğinde hata veriyordu.

Şu verdiği hata mesajında dahi tam bir açıklama yok. Ben stream modülünü hem açmak için hemde dosya oluşturmak için kullanıyorum.
Mantıken sen hangisinde hata olduğunu söylersen en azından hangi işlevini çalıştırırken hata verdiğini söylersen daha kolay anlaşırız.

Ama benim tahminim dosya oluştururken hata veriyor.


Kodların son halini(hata veren halini) ekledim. Sizde bir bakarsanız nedenini söylerseniz sevinirim.
canalpay (Moderator) #2
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Bu sefer ben yanıldım :-) 22 svn sürümü çalışıyor.

Ama hala benchmark mı ne idi. Onunla ilgili hatayı çok merak ediyorum :-)
canalpay (Moderator) #3
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Bir iki şey değiştirdim yine hata verdi.

Ve hatada hiç açıklayıcı değil. (aynı hatayı veriyor.)

Siz neden stream modülünü bu kadar çok sevdiğinizi anlamış değilim. Bana çok kırılgan geldi. stdio modülünde iken bu kadar hata almadım. Ta bu stream uğursuz :-) yada biraz hatalı.
acehreli (Moderator) #4
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Tam olarak ne yaptığını anlamadım. benchmark'ı nereye yazıyorsun?

Ali
canalpay (Moderator) #5
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
svn 23'teki kodlarda hata verdi.

bencmark başka bir hikaye :-)

Ayrıca daha sonra başka bir şeyler ile uğraştım onda da hata verdi. O kod da bu:  http://www.ozgurlukicin.com/yapistir/386/
acehreli (Moderator) #6
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Ben benchmark'ı 1000 ile bir kaç kere denedim ama bir sorun görmedim.

Eğer bu hatayı tekrarlama yöntemini bulabilirsen çok sevinirim. Yani sorunu gösteren ufak bir program olabilse...

Aklıma iki şey geliyor:

1) File ile işin bitince dosya.close() yap. O olmayınca belki de çöp toplayıcıya bırakıyoruzdur ve o dosyayı uzun süre açık tutuyordur.

2) dosya.close() diye açıkça çağırmak yerine, "çöp toplayıcıyı bekleme ve bu kapsamdan çıkılırken sonlandır" anlamına gelen scope'u kullan:

scope File dosya = new File(dosyaAdı,FileMode.Out);

Bakalım o ikisinin etkisi var mı...

Ali
canalpay (Moderator) #7
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Ben ilk önce genel olarak konuyu toplayayım:

1.Aslında benim sorunlarımın bencmark ile ilgisi yok. Sanırım kodları değiştirirken düzgün değiştirememişim o yüzden hata vermiş.( Yani hata bende.)(Aslında benim sorduğum ayrı şeydi bencmark ile alakası yoktu. Yoksa kim aynı veriye 10bin kere deneyecek :-) )



2. Ama gariptir bencmark ile 1_000 kere denerseniz sorun olmuyor 10_000 kere deneyince sorun oluşturuyor. Sizde deneyin.
acehreli (Moderator) #8
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Ben de benchmark'la ilgili olduğunu düşünmedim zaten. Art arda hızlıca çalıştırmak, hatayı açığa çıkartmaya yardım ediyor yalnızca.

Şimdi de 10_000 ile denedim ve hata almadım. Ama ben benchmark'la senin neyi denediğini bilmiyorum; tahmin etmek zorundayım.

Örneğin çalışma zamanı hatası aldığım için şu satırı çıkartmak zorunda kaldım:

//     taban.v_yedekle(ad); 

Sende de öyle mi?

Ve, çok merak ediyorum; şunlardan herhangi birisi hatayı gideriyor mu?

a) new File yaptığın kapsamlardan çıkmadan önce, yani return'den önce dosya.close() yazmak

b) new File yaptığında sol tarafın başına scope yazmak:

        scope File dosya = new File(dosyaAdı,FileMode.In);

Bunlardan birisi hatayı gidermeye yetiyor mu?

Ali
canalpay (Moderator) #9
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
veri_oku() hata veriyor(du).
Diğer seçenekleri denediğimi hatırlıyorum. Denemiştim ve yine hata vermişti ama şimdi scope denediğimde hata verdirtmiyor. 100_000_000 kere denediğimde bile hata vermiyor.
Teşekkürler.
acehreli (Moderator) #10
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by canalpay:
scope denediğimde hata verdirtmiyor

Gerçekler:

[DÜZELTME: Burada file.close demek istedim.]
- File.close, dosyayı kapatır ve dolayısıyla işletim sistemi kaynaklarını geri verir

- File'ın sonlandırıcı işlevi, dosya açıksa close()'u çağırır

- new ile oluşturulan nesne, normalde çöp toplayıcı tarafından ilerideki belirsiz bir zamanda sonlandırılır

Teori:

Çöp toplayıcı devreye girene kadar, sistemde dosyaya erişim sağlayacak kaynak kalmıyor. (Belirli sayının üstünde dosyanın açık olmasına izin verilmez.) Bir sonraki erişim de bu yüzden başarısız oluyor.

Hatta bu sınır, "program başına dosya" gibi bir sınır olmalı. Aşağıdaki program benim sistemimde en son 1020 yazıyor. Yani [0,1020] aralığında 1021 adet dosya açabiliyor. din, dout, ve derr'i de sayarsak; benim sistemim bir programın (process'in) 1024 dosyadan fazla açmasına izin vermiyor. Bu, çekirdekle ilgili bir ayardır.

Program şu:

import std.cstream;
import std.stream;
 
void main()
{
    foreach (i; 0 .. 10_000) {
        // Bu program şu hatayla çöker:
        // std.stream.OpenException: Cannot open or create file 'deneme.txt'
        //
        // Hatayı gidermek için; şunlardan birisi yeterli:
        //
        // a) satırın başına 'scope' yazmak
        auto dosya = new File("deneme.txt", FileMode.In);
        // b) burada dosya.close(); yazmak
        dout.writef(i, ' ');
    }
}

Şimdi öğrendim: konsolda ulimit -a yazmak, bu gibi sınırları bildiriyor. Onlardan -n ile de öğrenilebilen bir tanesi "open files", ve değeri bende 1024. (Değiştirilebiliyor; ama o işe girmeyeceğim. :) )

Eğer senin sisteminle benim sistemim arasında açık dosya sınırları farklıysa, veya çöp toplayıcının devreye girme kararı ikimizde farklıysa, bu hatayı benim neden görmediğim anlaşılır.

scope ise nesnenin çöp toplayıcıya bırakılmadan hemen sonlandırılmasını sağladığı için, program en fazla bir dosya kullanıyor ve sistem kaynakları tükenmiyor.

Öte yandan; std.stdio.File bir yapı olduğu için, onun nesneleri hemen sonlandırılıyor ve o tür kullanıldığında bu sorun yaşanmıyor. Bu, std.stdio.File'ın daha üstün olduğunu göstermez, :) yapılarla sınıfların bir farkını gösterir.

Ali
This post was edited on 2010-01-24, 14:35 by acehreli.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Forum: Projeler dkv RSS
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-02-05, 10:50:34 (UTC -08:00)