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に減らすと、問題は解決します。私の実際のコードでは、似たようなことをしたいのですが、バイトではなく、シリアル化するのはfloatの配列です。注意:問題をスピードアップするために、データ部分の入力をスキップできると思います。
これはprotobufバージョン2.0.0.594を使用しています。どんな助けでも大歓迎です!
編集:
バージョン2.0.0.480でも同じ問題が発生します。コードはバージョン1.0.0.280では実行されませんでした。