次のデータ モデルを検討してください。
data Artist = Artist Text
data Song = Song Artist Text
data Catalogue = Catalogue (Set Artist) (Set Song)
が とのArtist
両方から参照されていることがわかります。には から参照されたすべてのアーティストのリストが含まれているため、 の同じ値が2 つの場所から参照されます。Song
Catalogue
Catalogue
Song
Artist
Catalogue
次の関数の複数のアプリケーションを使用して値を生成するとします。
insertSong :: Song -> Catalogue -> Catalogue
insertSong song@(Song artist title) (Catalogue artists songs) =
Catalogue (Set.insert artist artists) (Set.insert song songs)
s が参照するのと同じCatalogue
値への参照によって が満たされることは明らかです。したがって、これらの値のコピーを保存しないことでメモリを節約できます。Artist
Song
問題は、一連のアーティストと一連の曲を個別に逆シリアル化して、シリアル化されたデータからカタログを再作成しようとすると、アプリケーションがCatalogue
withの同じ値を生成したときよりも多くのメモリを占有することinsertSong
です。sArtist
と から参照される同じ s の間の関係が失われたことが原因であると思われます。これが、余分なメモリを占有している値のコピーを取得する理由です。Song
Catalogue
Artist
私が見る唯一の解決策は、最初にアーティストのセットを逆シリアル化し、次に曲のセットを逆シリアル化し、値をArtist
最初のセットの値に強制的に置き換えることです。
だから私の質問は:
- 私の疑いは正しいですか?
- 私が見た解決策は機能しますか?
- これを解決するより良い方法はありますか?