我正在尝试使用 protobuf.net 序列化相当大量的数据。我遇到了OutOfMemoryException
抛出 s 的问题。我正在尝试使用流式传输数据,IEnumerable<DTO>
以免使用太多内存。这是应该导致错误的程序的简化版本:
class Program
{
static void Main(string[] args)
{
using (var f = File.Create("Data.protobuf"))
{
ProtoBuf.Serializer.Serialize<IEnumerable<DTO>>(f, GenerateData(1000000));
}
using (var f = File.OpenRead("Data.protobuf"))
{
var dtos = ProtoBuf.Serializer.DeserializeItems<DTO>(f, ProtoBuf.PrefixStyle.Base128, 1);
Console.WriteLine(dtos.Count());
}
Console.Read();
}
static IEnumerable<DTO> GenerateData(int count)
{
for (int i = 0; i < count; i++)
{
// reduce to 1100 to use much less memory
var dto = new DTO { Data = new byte[1101] };
for (int j = 0; j < dto.Data.Length; j++)
{
// fill with data
dto.Data[j] = (byte)(i + j);
}
yield return dto;
}
}
}
[ProtoBuf.ProtoContract]
class DTO
{
[ProtoBuf.ProtoMember(1, DataFormat=ProtoBuf.DataFormat.Group)]
public byte[] Data
{
get;
set;
}
}
有趣的是,如果将每个数组的大小减小DTO
到 1100,问题就会消失!在我的实际代码中,我想做类似的事情,但它是我将序列化的浮点数组,而不是字节。注意我认为您可以跳过填充数据部分以加快问题速度。
这是使用 protobuf 版本 2.0.0.594。任何帮助将非常感激!
编辑:
与版本 2.0.0.480 相同的问题。代码无法在版本 1.0.0.280 上运行。