Я застрял в ошибке сегментации после вставки около 8 миллионов записей в базу данных TC Hash. После того, как все вставлено, я закрываю БД, но в этой части кода обнаружена ошибка сегментации (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;
}
Более конкретно на закомментированной строке.
БД была открыта так:
tchdbopen(hdb, db_file, HDBOWRITER | HDBOCREAT))
БД настроена на:
tchdbtune(hdb, 25000000, -1, -1, HDBTLARGE);
tchdbsetcache(hdb, 100000);
Размер файла .tch составляет около 2 ГБ (2147483647 байт). Интересно то, что это происходит только тогда, когда я вставляю около 8 миллионов записей. С 2 или 3 миллионами БД закрывается все в порядке. Вставка 8 миллионов записей занимает около 3 часов, потому что я читаю данные из текстовых файлов.
Есть идеи?
Спасибо