Thread overview
std.stream çok mu hatalı(kırılgan) yoksa sorun bende mi ?
January 22, 2010

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 22, 2010

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 :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 22, 2010

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ı.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 22, 2010

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/

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 22, 2010

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 :-) )

  1. Ama gariptir bencmark ile 1_000 kere denerseniz sorun olmuyor 10_000 kere deneyince sorun oluşturuyor. Sizde deneyin.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 22, 2010

Tam olarak ne yaptığını anlamadım. benchmark'ı nereye yazıyorsun?

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 22, 2010

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 24, 2010

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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 23, 2010

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 24, 2010

Alıntı (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 gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]