2011-08-26 13 views
7

मैं डिस्क पर डेटा को सहेजने और लोड करने के लिए प्रोटोबफ-नेट का उपयोग करने की कोशिश कर रहा हूं लेकिन अटक गया।बड़ी डेटा फ़ाइलों को स्ट्रीम करने के लिए प्रोटोबफ-नेट का उपयोग करें INumerable

मेरे पास संपत्तियों का एक पोर्टफोलियो है जिसे मुझे संसाधित करने की आवश्यकता है, और मैं जितनी जल्दी हो सके ऐसा करने में सक्षम होना चाहता हूं। मैं पहले ही एक सीएसवी से पढ़ सकता हूं लेकिन बाइनरी फ़ाइल का उपयोग करना तेज़ होगा, इसलिए मैं प्रोटोबफ-नेट में देख रहा हूं।

मैं सभी संपत्तियों को स्मृति में फिट नहीं कर सकता, इसलिए मैं उन्हें स्ट्रीम करना चाहता हूं, उन्हें स्मृति में लोड नहीं करना चाहता हूं।

तो मुझे जो करना है वह एक बड़ी संख्या में रिकॉर्ड्स को एक आईनेमरेबल के रूप में सामने लाता है। क्या यह प्रोटोबफ-नेट के साथ संभव है? मैंने कुछ चीजों की कोशिश की है लेकिन इसे चलाने में सक्षम नहीं हैं।

सीरियलाइजिंग काम करने लगता है, लेकिन मैं उन्हें फिर से पढ़ने में सक्षम नहीं हूं, मुझे 0 संपत्तियां वापस मिलती हैं। क्या कोई मुझे सही दिशा में इंगित कर सकता है? Serializer कक्षा में विधियों को देखा लेकिन इस मामले को कवर करने वाले किसी भी व्यक्ति को नहीं मिला। मैं प्रोटोबफ-नेट द्वारा समर्थित यह उपयोग-केस? मैं वैसे भी वी 2 का उपयोग कर रहा हूँ।

अग्रिम धन्यवाद,

गर्ट-जन

यहां कुछ नमूना कोड मैंने कोशिश की है:

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

खेद है कि मैं मदद के लिए कुछ दिनों के दूर नहीं किया जा सकता था। खुशी है कि आपको जवाब मिला। –

+0

कोई चिंता नहीं बहुत लंबी रही। पूरी चीज लिखने के लिए आपके लिए एक बड़ा धन्यवाद! – gjvdkamp

उत्तर

7

यह पता लगा। PrefixBase.Base128 का उपयोग deserialize करने के लिए स्पष्ट रूप से is the default

अब यह एक आकर्षण की तरह काम करता है!

जी जे

 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 :-) 
     } 
संबंधित मुद्दे

 संबंधित मुद्दे