Jump to page: 1 2 3
Thread overview
November 26, 2012

Merhaba yine ben :)

Bu sefer web server için socket üzerinden yanıt verirken 1gblık bir dosyayı okuyup göndereceğim.
Ama 1 kere gönderiyor 2.kez göndermiyor çünkü hafızada şişme oluyor sanırım.

	while(1){
		read("C:/wwwroot/1.zip");
	}

bu kodu çalıştırdığınızda readi bir değişkene eşitlemediğiniz halde bir süre sonra program hata veriyor.

Okuduktan sonra hafızayı nasıl temizleyebilirim?

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

November 26, 2012

yeni proje açıp 2 kere açmayı denedim 1 gblık bir dosyayı.
2.kez açamadan program hata verdi kapandı.
Hata olarak
Unhandled exception at 0x7480C41F (KernelBase.dll) in test.exe: 0xE0440001 (parameters: 0x004480D0).
bu yazıyor bende bu yüzden tam olarak anlayamıyorum :D

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

November 26, 2012
module main;

import std.stdio, std.file, std.stream, core.memory;

int main(string[] argv)
{
	Stream file;
	file = new BufferedFile("C:/wwwroot/1.zip");
	char[] x;
	file.read(x);
	GC.free(&x);
	while(1){}
  return 0;
}

free ve destroyu denedim deleteyi denedim fark olmadı ama ram kullanımına baktım çok yüksek belleğe yükledikten sonra silmiyor. Peki belleğe bunları yüklemeden socket bağlantısı üzerinden direkt yollanabilir mi?

dosyayı okuduktan sonra sendTo ile gönderiyorum.

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

November 26, 2012

Biraz daha bilgi verebilir misin. Örneğin, eğer şüphelendiğin gibiyse küçücük bir programda iki kere açmayı deneyebilirsin. Yine hata oluyor mu?

Ama daha da önemlisi, "program hata veriyor" tam olarak ne demek? ;)

Belki nesneleri gereğinden uzun süre yaşatıyorsundur. Şu bölüm ilgili olabilir:

http://ddili.org/ders/d/clear.html

Tam ilgili olduğunu sanmıyorum ama şuradaki "Temizlik işlemleri" başlığı da çöp toplayıcıyı dürtmeyi gösteriyor:

http://ddili.org/ders/d/bellek_yonetimi.html

Ali

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

November 26, 2012

Evet, parça parça okumak daha mantıklı. sendTo() art arda gönderir ve dosya alıcı tarafta parça parça tekrar oluşturulur.

Öylesine, 10'ar bayt okuyan bir program:

module main;

import std.stdio, std.stream;

int main(string[] argv)
{
   Stream file;
   file = new BufferedFile("deneme_dosyasi");

   while (!file.eof()) {
       ubyte[10] x;
       size_t adet = file.read(x);
       writeln(x[0..adet]);
   }

   return 0;
}

std.stream önerilmiyor. std.stdio.rawRead'i de düşünebilirsin.

Ali

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

November 27, 2012

Yazdığınız büyük boyutlu dosyalarda çok zaman alıyor web serverde kullanacağım için hızlı olması lazım. Diğer dediğiniz yöntem için bir örnek yazabilir misiniz?

Teşekkür ederim.

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

November 27, 2012

Merhaba Zekeriya,

İstersen önce sorunu iyi analiz etmek için dosya değil de iç veri gönderelim. Bu da atıyorum, 1024 byte'lık rasgele veriler ile doldurulmuş bir dizinin, 1 GB. tutacak kadar defalarca gönderilmesi şeklinde olsun. Böylece sorunun socketStream tarafında mı yoksa fileStream tarafında mı olduğunu anlamış oluruz.

Başarılar...

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

November 27, 2012

Alıntı (zekeriyadurmus):

>

Yazdığınız büyük boyutlu dosyalarda çok zaman alıyor

(Benimkindeki 10 gibi küçük bir değer kullanmadığını varsayıyorum.) Neden zaman alıyor acaba? Paketlerin gidip gelmeleri için beklendiği (latency) için mi?

Parçalar halinde gönderildiğinde aslında koşutluktan bile yararlanılabilir. Dosyanın parçaları tek iş parçacığı tarafından okunur ve gönderici iş parçacıklarına verilir. Yanıtlar iş parçacıkları tarafından bekleneceğinden teoride dosya internet üzerinde aynı anda birden fazla parçasıyla gitmiş olur.

Ama o yanıltıcı bir düşünce oluyor çünkü yine de şunlarla kısıtlıyız:

  • dosyadan okuma yine de koşut değil

  • sunucunun internet bağlantısı belirli bir genişliğe sahip

  • istemcinin yazması da koşut değil

Başka bir nedeni de benim sabit uzunluklu dizi kullanmam olabilir mi acaba? Onlar değer türü olduklarından işlevlere gönderilirken kopyalanırlar. Dilim ile de deneyebilirsin:

       ubyte[] x;
       x.length = 1000;

Veya:

       auto x = new ubyte[](1000);

Ama bu noktada bunlar tahmin...

Alıntı:

>

web serverde kullanacağım için hızlı olması lazım.

vibe.d'yi düşündün mü? Ben daha hiç oynamadım ama şu olanak işine yarayabilir:

http://vibed.org/api/vibe.http.fileserver/

Alıntı:

>

Diğer dediğiniz yöntem için bir örnek yazabilir misiniz?

Yani, std.stdio.File'ı kullanmak... Daha önce şöyle bir örnek yazılmış:

import std.stdio;

void yaz(File dosya, size_t adet)
{
   foreach (i; 0 .. adet) {
       immutable bayt = cast(ubyte)i;
       dosya.rawWrite([ bayt ]);
   }
}

void oku(File dosya, size_t adet)
{
   auto okunan = new ubyte[](adet);

   dosya.rawRead(okunan);

   foreach (ubyte bayt; okunan) {
       writefln("%02x", bayt);
   }
}

void main()
{
   auto dosya = File("rawWrite_denemesi", "w+");

   yaz(dosya, 100);

   dosya.rewind();

   oku(dosya, 100);
}

Ali

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

November 27, 2012

Olay şu aslında boş bir proje açıp içerisinde 1gblık dosyayı okuma işlemi yapıyorum ve ram kullanımına bakıyorum 1 gb.
Sonra 2.kez bir dosya okumak istiyorum okumadan hata veriyor program çünkü önceki okuduğunu ramdan silemiyor.

ve 1024 bytelık olarak parçalarsak aşır derecede yavaş gider 1048576 tane yanıt gönderilmesi demek ki bu oldukça uzun sürmesine neden olur.

Hafızaya yüklemeden direkt olarak dosya göndermenin veya read ile okuduğumuz birşeyi hafızadan silmenin bir yolu var mı?

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

November 28, 2012

Yanıtınız için teşekkür ederim.
1 gblık dosya oluştuktan sonra okumaya geçince program hata verdi ve kapandı o sırada bellek kullanımına baktım sürekli olarak artıyordu 1gb 113 mb a gelince hata verdi.

Bilgisayarım da 8gb ram var ve i7 işlemci var windows 7 home premium.
Visual studio üzerinden çalışıyorum.

Acaba visual studio yüzünden mi hata veriyor.

D için doğru dürüst editör bulamadım ben de mecburen vs yi kullanıyorum şuan.

Önerebileceğiniz editör var mı?

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

« First   ‹ Prev
1 2 3