【发布时间】:2013-07-14 21:19:57
【问题描述】:
请考虑以下数据模型:
data Artist = Artist Text
data Song = Song Artist Text
data Catalogue = Catalogue (Set Artist) (Set Song)
您可以看到Artists 被Songs 和Catalogue 引用。 Catalogue 包含从Songs 引用的所有艺术家的列表,因此Artist 的相同值从两个位置引用。
假设我们要使用以下函数的多个应用程序生成Catalogue 值:
insertSong :: Song -> Catalogue -> Catalogue
insertSong song@(Song artist title) (Catalogue artists songs) =
Catalogue (Set.insert artist artists) (Set.insert song songs)
很明显,Catalogue 将通过引用 Artist 的相同值来填充 Songs 所引用的值,因此通过不存储这些值的副本来节省内存。
问题是,当我尝试通过分别反序列化一组艺术家和一组歌曲来从序列化数据中重新创建目录时,应用程序占用的内存比它生成相同的 Catalogue 和 @987654334 值时要多得多@。我怀疑这是由于Songs 和Catalogue 引用的同一Artists 之间的关系丢失造成的,这就是为什么我得到Artist 值的副本占用了额外的内存。
我看到的唯一解决方案是首先反序列化一组艺术家,然后反序列化一组歌曲,同时用第一组中的值强制替换 Artist 的值。
所以我的问题是:
- 我的怀疑是对的吗?
- 我看到的解决方案会起作用吗?
- 有没有更好的方法来解决这个问题?
【问题讨论】: