私たちのアプリケーションは大量のデータを操作します。ゲームと同様に、最大 1 ~ 2 GB の RAM を使用できます。同じ「同じオブジェクトの複数のコピーを保存する」問題に遭遇しました。また、バイナリ シリアライゼーションではメタデータが多すぎます。最初に実装されたとき、シリアル化されたファイルは約 1 ~ 2 GB かかりました。最近では、値を50〜100 MBに減らすことができました。私たちは何をしましたか。
短い答え - .Net バイナリ シリアライゼーションを使用せず、独自のバイナリ シリアライゼーション メカニズムを作成します。独自の BinaryFormatter クラスと ISerializable インターフェイス (Serialize、Deserialize の 2 つのメソッドを持つ) があります。
同じオブジェクトを複数回シリアル化しないでください。一意の ID を保存し、オブジェクトをキャッシュから復元します。
質問があれば、いくつかのコードを共有できます。
編集:あなたは正しいようです。次のコードを見てください - それは私が間違っていたことを証明しています.
[Serializable]
public class Item
{
public string Data { get; set; }
}
[Serializable]
public class ItemHolder
{
public Item Item1 { get; set; }
public Item Item2 { get; set; }
}
public class Program
{
public static void Main(params string[] args)
{
{
Item item0 = new Item() { Data = "0000000000" };
ItemHolder holderOneInstance = new ItemHolder() { Item1 = item0, Item2 = item0 };
var fs0 = File.Create("temp-file0.txt");
var formatter0 = new BinaryFormatter();
formatter0.Serialize(fs0, holderOneInstance);
fs0.Close();
Console.WriteLine("One instance: " + new FileInfo(fs0.Name).Length); // 335
//File.Delete(fs0.Name);
}
{
Item item1 = new Item() { Data = "1111111111" };
Item item2 = new Item() { Data = "2222222222" };
ItemHolder holderTwoInstances = new ItemHolder() { Item1 = item1, Item2 = item2 };
var fs1 = File.Create("temp-file1.txt");
var formatter1 = new BinaryFormatter();
formatter1.Serialize(fs1, holderTwoInstances);
fs1.Close();
Console.WriteLine("Two instances: " + new FileInfo(fs1.Name).Length); // 360
//File.Delete(fs1.Name);
}
}
}
BinaryFormatter
object.Equals を使用して同じオブジェクトを検索しているようです。
生成されたファイルの中を見たことがありますか? コード例の「temp-file0.txt」と「temp-file1.txt」を開くと、大量のメタデータが含まれていることがわかります。そのため、独自のシリアル化メカニズムを作成することをお勧めします。
混乱してすみません。