Veuillez considérer le modèle de données suivant: Vous pouvez voir que l'artiste code> S est mentionné à partir de la chanson code> S. et le catalogue Supposons que nous devions générer le catalogue code> code> à l'aide de plusieurs applications de la fonction suivante: p> Il est évident que le < code> catalogue code> sera rempli par des références aux mêmes valeurs de Le problème est que lorsque j'essaie de recréer le catalogue des données sérialisées en désérialisant séparément un ensemble d'artistes et un ensemble de chansons, l'application occupe une nouvelle mémoire que lorsqu'elle a généré la même valeur de La seule solution que je vois est de commencer à désérialiser l'ensemble des artistes, puis de désérialiser l'ensemble des chansons tout en remplaçant avec force les valeurs de < Code> Artiste Code> avec ceux de la première série. P> Donc, mes questions sont: p> code>. Le catalogue code> code> contient une liste de tous les artistes par rapport à
Song code> S. Les mêmes valeurs de
Artiste Code> sont mentionnées à partir de deux places. p>
artiste code> comme la chanson code> S se référer à, sauvegarde ainsi la mémoire en ne stockant pas les copies de ceux-ci valeurs. p>
catalogue code> avec
insertsong code>. Je soupçonne que cela est causé par la relation perdue entre le même
Artiste code> par rapport à partir de
Song code> S et le catalogue
code>, c'est pourquoi je reçois des copies des valeurs de
artiste code> occupant une mémoire supplémentaire. P>
3 Réponses :
Notez que le partage sera également perdu si vous faites un type de calcul sur vos chaînes (même si artist1 code> et
artist2 code> sont les mêmes et partagés,
f artist1 code> et
f artist2 code> ne sont probablement pas). Si cela devient un problème, vous pouvez également faire des modifications similaires à vos structures de données. P>
Une solution simple semble cacher des données en cache à l'aide d'une carte quelque peu dégénérée: Nous pouvons ensuite interroger ce cache s'il y a déjà une entrée égale à celle-ci et remplacez-la par la mise en cache Un: p> De cette façon, si nous chargons plusieurs éléments égaux de type Peut-être qu'il serait peut-être possible de le généraliser et d'utiliser SYB pour cartographier toutes les valeurs d'un type donné dans une structure de données via un cache: p> puis nous pouvons remplacer tous les artistes de certaines structures de données telles que p> ou nous pouvons utiliser A code>, nous les transformons en une seule. Cela peut être fait pendant la désérialisation ou une fois à la fin. P>
proxy code>
type de fantôme Pour créer une version générale: p> cacheAll :: (Ord a, Typeable a, Data b)
=> Proxy a -> b -> b
cacheAll p = flip evalState (emptyOf p) . replaceFromCache
where
emptyOf p = asTypeOf2 M.empty p
asTypeOf2 :: f a -> Proxy a -> f a
asTypeOf2 = const
cacheAllArtists :: (Data b) => b -> b
cacheAllArtists = cacheAll (Proxy :: Proxy Artist)
L'idée des génériques est très intéressante. Le problème est assez général pour que cette bibliothèque soit développée. Merci. Je vais regarder dans ça.
@Nikitavolkov, je participerai volontiers.
C'est génial! Bien que je dois admettre que je ne suis pas déjà prêt à plonger dans un tel projet, mais je resterai en contact avec vous si je reviendrai.
J'ai accidentellement trébuché sur un projet, qui s'approche de la question. Voir REFNERIALISE B> .
Je suis tombé accidentellement sur un projet, qui s'approche de la question. Voir refkerialize strong> . P>