TokyoCabinet: ошибка сегментации в hdb-> close () - PullRequest
1 голос
/ 27 августа 2009

Я застрял в ошибке сегментации после вставки около 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 часов, потому что я читаю данные из текстовых файлов.

Есть идеи?

Спасибо

1 Ответ

3 голосов
/ 28 августа 2009

только что решил проблему. Я на 32-битной системе, и TC может обрабатывать только базы данных до 2 ГБ в таких системах. Решением является сборка TC с опцией «--enable-off64». Примерно так:

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