9
votes

Grand tableau d'octet mutable dans Erlang

Comme j'écris une simple application de serveur Minecraft à Erlang, je suis désormais préoccupé par la question de savoir comment stocker et modifier efficacement les données du morceau. Pour ceux qui ne connaissent pas les internes de Minecraft: je dois stocker beaucoup de binaires (100-1000) d'une taille maximale de 32 Ko en mémoire. Jusqu'à ce moment-là, les fichiers binaires intégrés d'Erlang sont suffisants. Mais le serveur doit lire et modifier certains octets (par leur identifiant) dans ces billets assez souvent et je ne veux pas les copier tout le temps.
Une fonctionnalité agréable serait importée et exporter des fichiers binaires standard d'Erlang.

Y a-t-il une extension ou une base de données Erlang ou tout ce que je pourrais utiliser pour cela?


1 commentaires

En fin de compte, le problème a été résolu à l'aide de binaires de taille 4 Ko et de les modifier pour chaque changement de bloc. Bien que ce n'est pas le dernier mot en termes d'efficacité de la mise à jour, mais cela enregistre la mémoire. Si vous souhaitez avoir un look, le code est disponible chez Github .


3 Réponses :


0
votes

1000 binaires 32kb n'est pas une grosse affaire. Vous dites changer quelques octets? Peut-être que ce serait mieux si vous venez de faire un enregistrement des différentes parties que le binaire peut contenir ou qui sont souvent modifiés, de cette façon, vous pouvez modifier des parties du binaire sans copier les autres. Avec ETS, vous n'avez pas à vous soucier d'un tas de copies binaires en attente d'être GC'ed. Il en fait toujours une copie et c'est toujours GC'ed mais pas de la même manière qu'un processus. Vous pouvez également utiliser FULLWEEP_AFTER OPS pour créer un nettoyage de processus plus souvent.


0 commentaires

10
votes

Depuis que les fichiers binaires sont en lecture seule, je peux penser aux approches suivantes (en supposant que vous vous attendez à un taux élevé de changements):

  1. Utilisez une structure en forme d'arbre avec des fichiers binaires immuables relativement petits dans les feuilles. Dans ce cas, lorsque vous vous modifiez des données, vous n'avez besoin que de ré-créer de petites feuilles binaires + tous les nœuds jusqu'à la racine. En supposant que les changements sont "locaux" à une position, je pense, vous pouvez commencer par OCTO-Tree.
  2. Utilisez "Big" binaires + la liste des modifications (pouvant être aussi simple des fonctions). Lorsque vous devez modifier le monde, ajoutez simplement une nouvelle fonction à la liste. Lorsque quelqu'un demande l'État du monde, prenez Binary binaire et appliquez toutes les modifications de la liste. De temps en temps, "squash", tous changent et préparer un nouveau binaire d'état de base. Cela pourrait être combiné à une approche précédente (arbre avec paires de binaires / changements dans les feuilles).
  3. Déplacez la gestion mondiale mutable vers le code externe. Vous pouvez utiliser nifs ou ports . Je pense que ce serait le moyen le plus rapide. En outre, je pense qu'il serait relativement facile de le mettre en œuvre. La première version de l'API pourrait être aussi simple que World: Nouveau (x, y, z) -> ref (); Monde: obtenez (ref, x, y, z); Monde: Set (Ref, X, Y, Z, Valeur);

1 commentaires

Merci pour votre grande réponse! Je suppose que je vais utiliser la deuxième façon, car les modifications ne sont pas si souvent (pas plus de 5 octets par seconde et joueur).



3
votes

Ma suggestion est d'utiliser une structure "corde". Fondamentalement, une structure en forme d'arbre, généralement une arborescence ou une arborescence dans laquelle vous permettez uniquement de changer de parties de l'arbre. Cela vous permet d'avoir le meilleur des deux mondes: immuabilité avec des mises à jour rapides.

Je ne connais pas une mise en œuvre de la corde, mais c'est ce que vous voulez faire.

Une alternative consiste à utiliser ETS comme une matrice mutable. Il est assez rapide pour ce genre de chose.

La troisième option consiste à utiliser une structure arborescente spatiale pour représenter votre monde. Les octrees ou une structure semblable à une BSP sont quelque chose que je saisis, aveuglément.


0 commentaires