2009-08-27 10 views
1

Ich stecke bei einem Segmentierungsfehler fest, nachdem ich ungefähr 8 Millionen Datensätze in eine TC Hash Datenbank eingefügt habe. Nach allem, was eingeführt wird, schließe ich die DB aber ich fing einen Segmentation Fault in diesem Teil der Codes (tchdb.c):TokyoCabinet: Segmentierungsfehler bei 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; 
} 

Mehr Eigen an der kommentierten Zeile.

Die DB wurde wie folgt geöffnet:

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

Die .tch Datei über 2 GB ist (2147483647 Byte):

tchdbopen(hdb, db_file, HDBOWRITER | HDBOCREAT)) 

Die DB mit tunned wird. Das Interessante ist, dass es nur passiert, wenn ich ungefähr 8 Millionen Datensätze einfüge. Mit 2 oder 3 Millionen schließt die DB in Ordnung. Das Einfügen von 8 Millionen Datensätzen dauert etwa 3 Stunden, da ich Daten aus Textdateien lese.

Irgendwelche Ideen?

Danke

Antwort

3

Gerade das Problem gelöst. Ich bin auf einem 32-Bit-System und TC kann nur Datenbanken mit bis zu 2 GB in solchen Systemen verarbeiten. Die Lösung baut TC mit der Option "--enable-off64". Etwas wie dieses:

./configure --enable-off64 
make 
make install