2014-07-25 3 views
2

J'ai créé un Trie pour stocker quelques millions de mots.Sérialiser un trie

typedef struct trie 
{ 
    struct trie* c[38]; 
    unsigned int occ; 
} trie_t; 

occ est juste un nombre qui stocke le nombre d'occurrences des mots. Si 0: le noeud n'est pas un mot. c [38] est pour: 26 lettres + 10 nombre + '_' + '.'

Je veux le sérialiser pour que je puisse le réintégrer en mémoire sans avoir à le construire à chaque fois. Le problème est que j'ai utilisé malloc pour créer le Trie donc toute la mémoire n'est pas contiguë. Je voudrais forcer la mémoire dans laquelle le Trie est créé pour être contigu afin que je puisse remplacer les pointeurs par offset et sérialiser la structure entière.

Est-ce la bonne solution? Est-ce encore possible avec malloc ou dois-je construire mon propre allocateur de mémoire pour le faire?

+0

Donc, est-ce statique une fois construit - vous ne le mettez pas à jour? –

+0

oui. Pas de mise à jour. Le Trie est créé à partir d'une liste de mots qui ne changera jamais. – IggY

+0

Ensuite, il suffit de le construire. Comprenez que vous allez probablement "plier" certaines règles C et que vous devrez compter sur un "comportement non documenté" redouté pour faire l'adressage, mais pas de problème. –

Répondre

2

Affectez une seule matrice de structures et utilisez-les en séquence. Dans le cas où vous ne connaissez pas la taille totale des structures dont vous aurez besoin, vous réalisez le tableau.

Le résultat final est un tableau contigu de structures qui pointent partout.

+0

Hmmm ... Ce que vous voulez dire, c'est que j'alloue juste un gros tableau, faites un "my_malloc (size)" qui a un static "offset" qui me va dans ce tableau et fais: return array [offset]; décalage + = taille; (+ les trucs realloc), non? – IggY

+0

Quelque chose comme ça si vous décidez d'utiliser une fonction. Vous avez deux variables total_size et current_position, et realloc lorsque vous atteignez total_size. Puisque vous avez un tableau de structures, vous pouvez incrémenter de 1 et non pas en fonction de la taille. – this

+0

"Puisque vous avez un tableau de structures, vous pouvez incrémenter de 1 et non de la taille": Je fais toujours cette erreur :) – IggY