2011-08-26 25 views
7

olarak kullanmak için Protobuf-net'i kullanın Veriyi diske kaydetmek ve yüklemek için Protobuf-net kullanmaya çalışıyorum ancak takılıyorum.Büyük veri dosyalarını IEnumerable

İhtiyacım olan bir varlık portföyüm var ve bunu olabildiğince hızlı bir şekilde yapmak istiyorum. Bir CSV'den okuyabiliyorum, ancak ikili bir dosya kullanmak daha hızlı olurdu, bu yüzden Protobuf-Net'e bakıyorum.

Tüm varlıkları belleğe sığamıyorum, bu yüzden onları akışa almak istiyorum, hepsini belleğe yüklemiyorum.

Yapmam gereken şey, IEnumerable olarak geniş bir kayıt kümesini ortaya koymaktır. Bu Protobuf-Net ile mümkün mü? Birkaç şey denedim ama koşmayı başaramadım.

Serileştirme çalışıyor gibi görünüyor, ancak onları tekrar okuyamadım, 0 varlığını geri aldım. Birisi bana doğru yönde işaret edebilir mi lütfen? Serializer sınıfındaki yöntemlere bakıldı, ancak bu durumu kapsayan herhangi bir dosyayı bulamıyor. Ben Protobuf-net tarafından desteklenen bu kullanım çantası? Bu arada V2 kullanıyorum. peşin

sayesinde

Gert-Jan İşte denedim bazı örnek kod:

public partial class MainWindow : Window { 

    // Generate x Assets 
    IEnumerable<Asset> GenerateAssets(int Count) { 
     var rnd = new Random(); 
     for (int i = 1; i < Count; i++) { 
      yield return new Asset { 
       ID = i, 
       EAD = i * 12345, 
       LGD = (float)rnd.NextDouble(), 
       PD = (float)rnd.NextDouble() 
      }; 
     } 
    } 

    // write assets to file 
    private void Write(string path, IEnumerable<Asset> assets){ 
     using (var file = File.Create(path)) { 
      Serializer.Serialize<IEnumerable<Asset>>(file, assets); 
     } 
    } 

    // read assets from file 
    IEnumerable<Asset> Read(string path) { 
     using (var file = File.OpenRead(path)) { 
      return Serializer.DeserializeItems<Asset>(file, PrefixStyle.None, -1); 
     } 
    } 

    // try it 
    private void Test() { 
     Write("Data.bin", GenerateAssets(100)); // this creates a file with binary gibberish that I assume are the assets 
     var x = Read("Data.bin"); 
     MessageBox.Show(x.Count().ToString()); // returns 0 instead of 100 
    } 

    public MainWindow() { 
     InitializeComponent(); 
    } 

    private void button2_Click(object sender, RoutedEventArgs e) { 
     Test(); 
    } 
} 

[ProtoContract] 
class Asset { 

    [ProtoMember(1)] 
    public int ID { get; set; } 

    [ProtoMember(2)] 
    public double EAD { get; set; } 

    [ProtoMember(3)] 
    public float LGD { get; set; } 

    [ProtoMember(4)] 
    public float PD { get; set; } 
} 
+0

Üzgünüm Yardım- birkaç gün uzakta zorunda kaldı. Cevabı bulduğuna sevindim. –

+0

hiçbir endişe çok uzun sürmedi. Her şeyi (yeniden) yazmak için büyük bir teşekkür! – gjvdkamp

cevap

7

bunu anladım. Serileştirmek için PrefixBase.Base128'i görünüşte is the default kullanın.

Şimdi çekicilik gibi çalışıyor!

GJ

 using (var file = File.Create("Data.bin")) { 
      Serializer.Serialize<IEnumerable<Asset>>(file, Generate(10)); 
     } 

     using (var file = File.OpenRead("Data.bin")) { 
      var ps = Serializer.DeserializeItems<Asset>(file, PrefixStyle.Base128, 1); 
      int i = ps.Count(); // got them all back :-) 
     } 
İlgili konular