protobuf-csharp-portに付属の標準アドレス帳のチュートリアルを作成しました。コードは次のとおりです。protobuf-csharp-port - LINQ-to-XMLのaxis関数のようなファイルからのストリーミングレコード
class Program
{
static void Main(string[] args)
{
CreateData();
ShowData();
}
private static void CreateData()
{
AddressBook.Builder abb = new AddressBook.Builder();
for (int i = 0; i < 2000000; i++)
{
Person.Builder pb = new Person.Builder();
pb.Id = i;
pb.Email = "[email protected]";
pb.Name = "John" + i;
abb.AddPerson(pb.Build());
}
var ab = abb.Build();
var fs = File.Create("c:\\testaddressbook.bin");
ab.WriteTo(fs);
fs.Close();
fs.Dispose();
}
private static void ShowData()
{
var fs = File.Open("c:\\testaddressbook.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
CodedInputStream cis = CodedInputStream.CreateInstance(fs);
cis.SetSizeLimit(Int32.MaxValue);
AddressBook ab = AddressBook.ParseFrom(cis);
Console.WriteLine("Person count: {0}", ab.PersonCount);
for (int i = 0; i < ab.PersonCount; i++)
Console.WriteLine("Name: " + ab.GetPerson(i).Name);
Console.WriteLine("Person count: {0}", ab.PersonCount);
fs.Close();
}
}
データの書き込み時には、2mレコードに300MBのRAMが必要です。読み込みには約415 MBのRAMが必要です。
XMLの世界では、軸機能を使用して要素をストリーミングします。アドレス帳モデルオブジェクト内のレコードをストリーミングすることは可能ですか?もっと効率的なメモリ使用のためにこれを実装する別の方法がありますか?
おかげ
ありがとう! – krisdyson