c# - 大型原始数组的 protobuf-net 序列化性能

标签 c# protobuf-net

我有 2 个关于超大对象序列化的问题。

1: 当你序列化一个对象 >> 2GB 并带有长度前缀时会发生什么?乍一看,长度前缀似乎是一个整数。 prototobuf-net 是否支持序列化这种带有 legth 前缀的大对象?

2:以下类的序列化似乎要花很长时间(对于 950,000,000 个整数):

[ProtoContract]
public class Xyz
{
    [ProtoMember(1, IsPacked = true)]
    public int[] Field { get; set; }
}

快速序列化代码为:

int nn = 950000000;
Xyz xyz = new Xyz();
xyz.Field = new int[nn];
for (int i = 0; i < nn; i++)
{
    xyz.Field[i] = i + 1;
}

RuntimeTypeModel xyzModel = RuntimeTypeModel.Create();
xyzModel.Add(typeof(Xyz), true);
TypeModel realModel = xyzModel.Compile();

using (var fs = new FileStream(@"C:\file.bin", FileMode.Create))
{
    realModel.Serialize(fs, xyz);
}

为简洁起见,我检查了磁盘等是否有问题。使用:

using (var bw = new BinaryWriter(fs))
{
    for (int i = 0; i < nn; i++)
    {
        bw.Write(xyz.Field[i]);
    }
}

使用 BinaryWriter 直接写入所有内容,即使对于这个数量的元素,也只需要很少的时间。

我希望使用 protobuf-net 时速度会慢一些,但我希望它仍然实用。连载等了15分钟,还没完。

是我的用法有误还是应该这么慢?


注意 这只是一个示例,是更大解决方案的一部分。我对用 protobuf-net 序列化这些东西很感兴趣,即使对于这个特定的例子,显而易见的选择是手动编写所有整数 :)。

问候,尤利安

最佳答案

  1. 在线路级别,“varint”应该没问题 - 它最多可以容纳 64 位;但是,我怀疑实现是否已经过超过 2GB 大小的测试;请注意,谷歌推荐的 Protocol Buffer 使用量比那个小得多

  2. 是的,序列化 10 亿个东西可能需要相当长的时间;我没有看过那个特定的数组场景,但如果我不得不猜测的话:它试图先在内存中缓冲它;这可能是我要优化的场景

关于c# - 大型原始数组的 protobuf-net 序列化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26103846/

相关文章:

c# - Visual Studio 中的 Entity Framework : database is not created with DbContext base constructor

protobuf-net - 使用 Protobuf,用 [IgnoreDataMember] 标记属性是否多余?

xamarin.ios - 如何将 Protobuf-Net 与 MonoTouch 结合使用?

c# - 如何以编程方式在 mysql 表中创建两个外键

serialization - 如何将 C# 中现有的 POCO 类转换为 google Protobuf 标准 POCO

c# - 使用 WCF 和 F# 的进程间通信

c# - ProtoBuf-Net 错误信息 "Invalid field in source data: 0"

c# - 自定义 CSS 标签

c# - 获得新的 access_token 后如何更新我的 cookie?

c# - 命令模式 : Any point in OOP? 的丑陋体验