Bonjour,
je dois manipuler des structures d'arbres avec pour chaque noeud un nombre de fils pouvant aller jusqu'à plusieurs milliers (pour le moment environ 17000), et d'une profondeur pouvant varier de 3 à 6 (la structure stoque des n-grammes). Donc je ne peux pas tout charger en mémoire. Les arbres se construisent en parcourant un corpus. J'ai envisagé deux solutions mais comme elles sont laborieuses à implémenter, je vous demande votre avis d'experts avant.
La première est la suivante : quand on rencontre un n-gramme, on charge un certain nombre de n-grammes stoqués dans un fichier, ceux qui sont "autour" du n-gramme courant. Puis tant qu'on ne sort pas du cadre et que la mémoire utilisée ne dépasse pas un certain seuil, on insère les n-grammes suivants (ou on modifie le nombre d'occurrences s'ils ont déjà été insérés). Si on sort du cadre on recommence comme avec le premier n-gramme, après avoir modifié le fichier bien-sûr, et on stoque chaque fois les indices auquels le premier élément dans la liste des n-grammes change. Par exemple pour la liste :
1 2 3
1 3 9
1 6 7
2 8 5
2 1 1
on stoquerait (0, 3). Ainsi on peut retrouver les n-grammes plus rapidement avec une dichotomie.
La seconde : on crée un fichier par noeud du premier niveau (ou plutôt le niveau correspondant aux premiers éléments des n-grammes) et on en garde un certain nombre en mémoire. Au début ils sont tous en mémoire et petit à petit on n'en garde que certains quand la mémoire occupée dépasse un certain seuil. Et quand un n-gramme recherché n'est pas dans ceux en mémoire, on charge le fichier correspondant et on "décharge" un autre sous-arbre. Le problème c'est que cela implique la manipulation de 17000 fichiers.
Que pensez-vous de ces deux solutions ? En auriez-vous de meilleures à proposer ?
J'ai oublié de dire qu'à terme je voudrais que la liste des n-grammes soit stoquée dans un fichier.
Partager