2012-03-28 23 views
5

Bir dosyaya büyük miktarda veri < 2GB yazdığımda bir sorunum var. İlk ~ 1.4GB veri kodun gerçekten yavaş (0-2 MB/s) daha hızlı (100 MB/s) yazılmıştır.Dosyaya önbellekleme sorunu için büyük veri yazın

Kodum (basitleştirilmiş) 'dir:

//FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000; 
    FileOptions fileOptions = FileOptions.SequentialScan; 

    int fileBufferSize = 1024 * 1024; 
    byte[] Buffer = new byte[32768]; 

    Random random = new Random(); 
    long fileSize = 2588490188; 
    long totalByteWritten = 0; 

    using (FileStream fs = File.Create(@"c:\test\test.bin", fileBufferSize, fileOptions)) 
    { 
     while (totalByteWritten < fileSize) 
     { 
      random.NextBytes(Buffer); 
      fs.Write(Buffer, 0, Buffer.Length); 
      totalByteWritten += Buffer.Length; 
      //Thread.Sleep(10); 
     } 
    } 

Orada düşünüyorum RAM kullanımı durağı artırmak için ne zaman "hızlı yazma performansı" RAM yanı artış kullanılan sırasında aslında, önbelleğe alma sorunla ilgili bir konudur performans düşüşüdür.

denedim Ne:

  • değişim zaman uyumsuz yazma için -> hiçbir anlamlı

  • değişikliği fileBufferSize değiştirmek -> hiçbir anlamlı değişiklik dizisi tampon boyutu

  • değiştirmek - > önemli bir değişiklik yok, ancak büyük bir arabellekle ~ 100MB, yazma performansı hızlı ve RAM kullanımı durduğunda, yazma p performansı alabilirsiniz 0'a gider ve bir süre sonra geri 100MB gider yerine, ön arabellek

  • değişiklik fileOption-WriteThrough "kızarmış" olduğunu dikişler -> performans her zaman yavaş ..

  • sonra ekleme xx fs.Flush(true) döngüler -> hiçbir anlamlı bir değişiklik

  • yorumsuz Thread.Sleep(10) -> yazma hızı ..... bu garip her zaman iyidir edilir

+0

thread.sleep belleğin temizlenmesini ve diske dökülmesine yardımcı oluyor gibi görünüyor. hd yazma hızınızın bir kıyaslamasını yapabilir misiniz? Başta her şey belleğe yazılıncaya kadar dolu olduğunu ve daha sonra hem windows disk belleği dosyasının yazıldığını (hem de belleği kapladığından beri) yazdığınızı ve dosyanızın yazmaya devam ettiğini, dolayısıyla performansın azaldığını düşünüyorum. ama yanılıyor olabilirim :) – Dementic

+0

Sistem üzerinde çalışan ve RAM dolduğunda performansı yavaşlatan ve veri diske yazmaya başlayan bazı virüsten koruma yazılımı var mıdır? –

+0

Hm, ''FileOptions.SequentialScan' 'anlayışımın hiçbirinin sizin senaryoda hiç bir faydası yoktur. Diskin yazmadan * okunması * bu önemli olacaktır. Anladığım kadarıyla, bu sadece basitleştirilmiş bir kod snippet'idir, bu yüzden ´random.NextBytes´ gerçek veriler için sadece bir yer tutucudur. Gerçek veriler nereden geliyor? Gerçek verileri toplamak suçlu olabilir mi? –

cevap

0

Bir şekilde bir önceki parçayı yazmayı ve dağınıklıktan önce yazmayı deniyor mu? (olası görünmüyor, ancak Thread.Sleep'un bunu hızlandırması çok garip ve bunu açıklayabilir). Bu gibi filestream'i kilitlemek için kullanma ifadesinin içindeki kodu değiştirirseniz ne olur?

using (FileStream fs = File.Create(@"c:\testing\test.bin", fileBufferSize, fileOptions)) 
{ 
    while (fs.Position < fileBufferSize) 
    { 
    lock(fs) // this is the bit I have added to try to speed it up 
    { 
     random.NextBytes(Buffer); 
     fs.Write(Buffer, 0, Buffer.Length); 
    } 
    } 
} 

DÜZENLEME: Ben doğru boyuttaki bir dosyayı yazma yapmak için gereken süre döngü içerecek şekilde örnek kod uğraştık.

Tesadüfen, örnek kodu çalıştırdığımda, lock bildirimi olsun veya olmasın çok hızlıdır ve uyku eklemek önemli ölçüde yavaşlatır.

İlgili konular