Je gère une application Erlang qui écrit souvent des millions d'enregistrements dans la table mnesia pour créer une planification. Lorsque l'heure est venue, les enregistrements sont exécutés et supprimés de la table. La table est configurée avec {type, disk_copies}, {type, ordered_set}
. J'utilise des opérations de transaction pour l'écriture et des opérations dirty pour supprimer les enregistrements.
J'ai fait une expérience qui écrit 2 millions d'enregistrements puis les supprime tous : la mémoire RAM n'a pas été récupérée une fois l'opération terminée. Il y a un pic qui double la mémoire lorsque je commence à supprimer ces enregistrements. Par exemple, la mémoire beam commence à 75 Mo, et après l'expérience elle passe à 410 Mo. J'ai utilisé erlang:memory()
pour inspecter la mémoire avant et après, j'ai trouvé que la mémoire était consommée par les process_used et binary
mais en réalité, je n'ai effectué aucune action avec binary. Si j'utilise erlang:garbage_collect(Pid)
pour tous les processus en cours d'exécution, la mémoire est récupérée, ne laissant que 180 Mo.
Toute suggestion pour résoudre ce problème serait grandement appréciée. Merci beaucoup.