7
votes

Références aux mêmes données et répartition de la mémoire

Veuillez considérer le modèle de données suivant: xxx

Vous pouvez voir que l'artiste S est mentionné à partir de la chanson S. et le catalogue . Le catalogue contient une liste de tous les artistes par rapport à Song S. Les mêmes valeurs de Artiste sont mentionnées à partir de deux places.

Supposons que nous devions générer le catalogue à l'aide de plusieurs applications de la fonction suivante: xxx

Il est évident que le < code> catalogue sera rempli par des références aux mêmes valeurs de artiste comme la chanson S se référer à, sauvegarde ainsi la mémoire en ne stockant pas les copies de ceux-ci valeurs.

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 catalogue avec insertsong . Je soupçonne que cela est causé par la relation perdue entre le même Artiste par rapport à partir de Song S et le catalogue , c'est pourquoi je reçois des copies des valeurs de artiste occupant une mémoire supplémentaire.

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 avec ceux de la première série.

Donc, mes questions sont:

  1. ai-je raison dans ma suspicion?
  2. la solution que je vois du travail?
  3. Y a-t-il de meilleurs moyens de résoudre ce problème?

0 commentaires

3 Réponses :


6
votes
  1. Cela semble plausible.
  2. Cela devrait fonctionner si cela est fait correctement. En particulier, vous devez vous assurer que tout est évalué avec impatience, pour éviter de référencer les anciennes valeurs de texte de Thunks.
  3. Vous pouvez choisir un format de sérialisation plus intelligent. Par exemple, lorsque vous Serialize Songs, stockez l'index de l'artiste dans la liste des artistes au lieu du nom complet de l'artiste. Puis regardez-le pendant la désérialisation.

    Notez que le partage sera également perdu si vous faites un type de calcul sur vos chaînes (même si artist1 et artist2 sont les mêmes et partagés, f artist1 et f artist2 ne sont probablement pas). Si cela devient un problème, vous pouvez également faire des modifications similaires à vos structures de données.


0 commentaires

3
votes

Une solution simple semble cacher des données en cache à l'aide d'une carte quelque peu dégénérée: xxx pré>

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> xxx pré>

De cette façon, si nous chargons plusieurs éléments égaux de type A code>, nous les transformons en une seule. Cela peut être fait pendant la désérialisation ou une fois à la fin. P>


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> xxx pré>

puis nous pouvons remplacer tous les artistes de certaines structures de données telles que p> xxx pré>

ou nous pouvons utiliser 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)


4 commentaires

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 .



1
votes

Je suis tombé accidentellement sur un projet, qui s'approche de la question. Voir refkerialize .


0 commentaires