加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用Protobuf-net将大数据文件作为IEnumerable流式传输

发布时间:2020-12-15 17:15:16 所属栏目:百科 来源:网络整理
导读:我正在尝试使用Protobuf-net来保存数据并将数据加载到磁盘但却卡住了. 我有一个我需要处理的资产组合,我希望能够尽快做到这一点.我已经可以从CSV读取,但使用二进制文件会更快,所以我正在研究Protobuf-Net. 我无法将所有资源都放入内存中,因此我想将它们流式
我正在尝试使用Protobuf-net来保存数据并将数据加载到磁盘但却卡住了.

我有一个我需要处理的资产组合,我希望能够尽快做到这一点.我已经可以从CSV读取,但使用二进制文件会更快,所以我正在研究Protobuf-Net.

我无法将所有资源都放入内存中,因此我想将它们流式传输,而不是将它们全部加载到内存中.

所以我需要做的是将一大堆记录暴露为IEnumerable.这可能与Protobuf-Net有关吗?我尝试了几件事,但还没能让它运转起来.

序列化似乎有效,但我无法再次读取它们,我得到0资产.有人能指出我正确的方向吗?查看了Serializer类中的方法,但找不到任何涵盖这种情况的方法.我这个用例由Protobuf-net支持吗?我顺便使用V2.

提前致谢,

格特 – 扬

这是我尝试的一些示例代码:

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; }
}

解决方法

弄清楚了.要反序列化使用PrefixBase.Base128,显然是 is the default.

现在它就像一个魅力!

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 :-)
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读