Question

Si j'ai un immuable Carte que je pourrais attendre (sur une période de temps très court - comme quelques secondes) à ajouter / supprimer des centaines de milliers de articles de, est la norme HashMap une mauvaise idée? Disons que je veux passer 1Go de données via la carte dans <10 secondes de telle sorte que la taille maximale de la carte à tout instant une fois seulement 256Mo.

Je l'impression que la carte conserve une sorte de « l'histoire », mais je vais le toujours être accéder à la table de la dernière mise à jour (à savoir que je ne passe pas sur le plan), car il est un organisme privé variable membre d'un Actor qui est mis à jour / accessible uniquement à partir de réactions.

Fondamentalement Je pense que cette structure de données peut être (partiellement) à défaut pour les questions que je vois autour JVMs allant de la mémoire lors de la lecture en grandes quantités de données dans un court laps de temps.

Serais-je mieux avec une implémentation carte différente et, si oui, quel est-il?

Était-ce utile?

La solution

Aïe. Pourquoi vous devez utiliser une carte immuable? garbage collector pauvres! Les cartes Immuable exigent généralement (log n) de nouveaux objets par opération, en plus de (log n), ou vraiment juste envelopper des cartes de hachage mutables et couche changesets sur le dessus (ce qui ralentit les choses et peut augmenter le nombre de créations d'objets).

immutabilité est grande, mais cela ne me semble pas comme le temps de l'utiliser. Si je devais vous, je bâton avec scala.collection.mutable.HashMap. Si vous avez besoin d'un accès simultané, enveloppez Java util.concurrent une place.

Vous pouvez également augmenter la taille de la jeune génération dans la machine virtuelle Java: -Xmn1G ou plus (en supposant que vous en cours d'exécution avec -Xmx3G). En outre, utiliser le débit (parallèle) ramasse-miettes.

Autres conseils

Ce serait terrible. Vous dites que vous voulez toujours accéder à la table de dernière mise à jour, cela signifie que vous avez seulement besoin d'un éphémère structure de données, il n'y a pas besoin de payer le coût d'une persistante structure de données - il est comme le temps de la négociation et de la mémoire pour gagner des « points de style » tout à fait défendables. Vous êtes pas la construction de votre karma en utilisant des structures aveuglément persistants lorsqu'ils ne sont pas nécessaires.

En outre, une table de hachage est une structure particulièrement difficile à faire persistante. En d'autres termes, « très, très lent » (essentiellement, il est utile quand lit beaucoup plus nombreux que les écritures - et vous semblez parler beaucoup écrit)

.

Par ailleurs, un ConcurrentHashMap ne serait pas logique dans cette conception, étant donné que la carte est accessible à partir d'un seul acteur (c'est ce que je comprends de la description).

soi-disant Scala (*) Carte immuable est brisée au-delà de l'utilisation de base jusqu'à Scala 2.7. Ne pas me faire confiance, il suffit de regarder le nombre de billets ouverts pour elle. Et la solution est juste «il sera remplacé par quelque chose d'autre sur Scala 2.8 » (ce qu'il a fait).

Donc, si vous voulez une carte immuable pour Scala 2.7.x, je vous conseille de chercher dans autre chose que Scala. Ou tout simplement utiliser TreeHashMap à la place.

(*) Carte immuable de Scala est pas vraiment immuable. Il est une structure de données mutables en interne, ce qui nécessite beaucoup de synchronisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top