2009-10-25 29 views
6

BinaryFormatter ile seri hale getirme/serileştirme, sonuçlanan serileştirilmiş dosya ~ 80MB boyutundadır. Deserialization birkaç dakika sürer. Bunu nasıl geliştirebilirim?Seri hızlandırma nasıl artırılır?

public static Universe DeserializeFromFile(string filepath) 
    { 
     Universe universe = null; 

     FileStream fs = new FileStream(filepath, FileMode.Open); 

     BinaryFormatter bf = new BinaryFormatter(); 
     try 
     { 
      universe = (Universe)bf.Deserialize(fs); 
     } 
     catch (SerializationException e) 
     { 
      Console.WriteLine("Failed to deserialize. Reason: " + e.Message); 
      throw; 
     } 
     finally 
     { 
      fs.Close(); 
     } 

     return universe; 
    } 

Belki deserializing veya başka seri hale tekniğini kullanmak belleğe tüm önceki okuyun: İşte seri kaldırma kodu?

cevap

0

Dosyayı bir seferde ilk önce bir bellek akışında okumayı deneyin, ardından bellek akışını kullanarak seri hale getirin.

+3

Bu, işleri daha kötüsü değil, daha iyi hale getirirse, seri hale getirme biçimi berbat olur. Neden I/O bağlı bir görevi yerine getirir * ve ardından her ikisini de yapabildiğiniz zaman CPU'ya bağlı bir görev izler. – hobbs

2

UnsafeDeserialize ürününü deneyin. Hızını arttırdığı söyleniyor.

+0

UnsafeDeserialize 460138 ms, Deserialize 459967 ms .. yani. Deserialize aslında daha hızlıydı! Başlıkları UnsafeDeserialize ile null olarak ayarladım, bu belki de neden? – Carlsberg

-1

Evren sınıfında ISerializable uygulamak

0

Veriler ne kadar karmaşık? Bir ağacı (grafiği) yerine bir nesne ise, protobuf-net'u denemekten ilginç sonuçlar alabilirsiniz. Bu genel olarak var olan sınıflara sığması oldukça kolaydır ve genellikle çok daha küçük, daha hızlı ve daha az kırılgandır (veriyi çökermeden nesne modelini değiştirebilirsiniz).

Açıklama: Yazarım, bu yüzden önyargılı olabilirim - ama gerçekten de korkunç değil ... Yine de, denemenize yardımcı olmak için biraz zaman ödünç veririm.

* = bir sebeple

İlgili konular