2009-08-27 5 views
1

Je suis bloqué à une erreur de segmentation après avoir inséré environ 8 millions d'enregistrements dans une base de données TC Hash. Après tout est inséré je ferme la DB, mais j'ai attrapé une erreur de segmentation dans cette partie du code (tchdb.c):TokyoCabinet: Erreur de segmentation à hdb-> close()

static void tchdbsetflag(TCHDB *hdb, int flag, bool sign){ 
    assert(hdb); 
    char *fp = (char *)hdb->map + HDBFLAGSOFF; 
    if(sign){ 
    *fp |= (uint8_t)flag; //SEGFAULT HERE! 
    } else { 
    *fp &= ~(uint8_t)flag; 
    } 
    hdb->flags = *fp; 
} 

Plus especifically à la ligne commentée.

La DB a été ouvert comme ceci:

tchdbopen(hdb, db_file, HDBOWRITER | HDBOCREAT)) 

La DB est tunned avec:

tchdbtune(hdb, 25000000, -1, -1, HDBTLARGE); 
tchdbsetcache(hdb, 100000); 

Le fichier .TCH est d'environ 2 Go (2147483647 octets). Ce qui est intéressant, c'est que cela ne se passe que lorsque j'insère environ 8 millions d'enregistrements. Avec 2 ou 3 millions, la DB se ferme bien. L'insertion de 8 millions d'enregistrements prend environ 3 heures parce que j'ai lu des données à partir de fichiers texte.

Des idées?

Merci

Répondre

3

Vous venez de résoudre le problème. Je suis sur un système 32 bits et TC ne peut gérer que des bases de données allant jusqu'à 2 Go dans de tels systèmes. La solution construit TC avec l'option "--enable-off64". Quelque chose comme ceci:

./configure --enable-off64 
make 
make install 
Questions connexes