Tokyocabinet: Segmentation fault à hdb-> close ()

voix
1

Je suis coincé à une faute de Segmentation après l'insertion d'environ 8 millions d'enregistrements dans une base de données Hash TC. 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):

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). La chose intéressante est qu'il ne se passe lors de l'insertion d'environ 8 millions de disques. Avec 2 ou 3 millions le DB se ferme tout droit. L'insertion 8 millions de disques prend environ 3 heures parce que je lis les données de fichiers texte.

Des idées?

Merci

Créé 27/08/2009 à 04:01
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
3

Juste résolu le problème. Je suis sur un système 32bits et TC ne peut gérer des bases de données jusqu'à 2 Go dans de tels systèmes. La solution est la construction TC avec l'option "--enable-off64". Quelque chose comme ça:

./configure --enable-off64
make
make install
Créé 28/08/2009 à 04:49
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more