SORU
24 Temmuz 2009, Cuma


C büyük dosyalar için bir sağlama toplamı oluşturmak için en hızlı yolu nedir#


Bazı makineler üzerinde büyük dosyaları senkronize etmek zorundayım. Dosyaları 6 Gb boyutunda olabilir. Senkronizasyon el ile birkaç haftada bir yapılır. I cant zaman zaman değişebilir, çünkü dikkate dosya adını alır.

Planım hedef bölgelerde değil zaten, olan bir sağlama ile dosyaları tüm kaynak ve PC den kopyala hedef PC ve sağlama toplamı oluşturmak için. Benim ilk denemem böyle bir şey oldu:

using System.IO;
using System.Security.Cryptography;

private static string GetChecksum(string file)
{
    using (FileStream stream = File.OpenRead(file))
    {
        SHA256Managed sha = new SHA256Managed();
        byte[] checksum = sha.ComputeHash(stream);
        return BitConverter.ToString(checksum).Replace("-", String.Empty);
    }
}

Sorun çalışma zamanı:
- 1,6 GB bir Dosya ile SHA256 ->20 dakika
- 1,6 GB bir Dosya ile MD5 ->6.15 dakika

Daha iyi - daha hızlı - bir şekilde sağlama toplamı (belki daha iyi bir karma işlev ile) var mı?

CEVAP
24 Temmuz 2009, Cuma


Sorun burada SHA256Managed okur 4096 bayt bir zaman (miras FileStream geçersiz Read(byte[], int, int) bakın ne kadar okur, filestream), çok küçük bir arabellek için disk IO.

Hızlandırmak için (2 dakika karma 2 Gb dosya üzerinde benim makine ile SHA256, 1 dakika MD5 tamamlamış FileStream BufferedStream ve set makul boyutlu arabellek boyutu (denedim ile ~1 Mb arabellek):

// Not sure if BufferedStream should be wrapped in using block
using(var stream = new BufferedStream(File.OpenRead(filePath), 1200000)
{
    // The rest remains the same
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HowToBasic

    HowToBasic

    8 Aralık 2011
  • JamesAtiPhone

    JamesAtiPhon

    16 EYLÜL 2010
  • RyanXLT

    RyanXLT

    22 Ocak 2011