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