Forum: Projeler dkv RSS
std.stream çok mu hatalı(kırılgan) yoksa sorun bende mi ?
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: 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 (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #3
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Tam olarak ne yaptığını anlamadım. benchmark'ı nereye yazıyorsun?

Ali
canalpay (Moderatör) #5
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #7
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #9
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Bu mesaj acehreli tarafından değiştirildi; zaman: 2010-01-24, 13:35.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Projeler dkv RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-10-20, 23:56:11 (UTC -07:00)