我有 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 序列化这些东西很感兴趣,即使对于这个特定的例子,显而易见的选择是手动编写所有整数 :)。
问候,尤利安
最佳答案
在线路级别,“varint”应该没问题 - 它最多可以容纳 64 位;但是,我怀疑实现是否已经过超过 2GB 大小的测试;请注意,谷歌推荐的 Protocol Buffer 使用量比那个小得多
是的,序列化 10 亿个东西可能需要相当长的时间;我没有看过那个特定的数组场景,但如果我不得不猜测的话:它试图先在内存中缓冲它;这可能是我要优化的场景
关于c# - 大型原始数组的 protobuf-net 序列化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26103846/