TokyoCabinet:hdb-> close()的分段错误

时间:2009-08-27 03:01:28

标签: c++ c segmentation-fault tokyo-cabinet

在TC哈希数据库中插入大约800万条记录后,我陷入了分段错误。插入所有内容后,我关闭了数据库,但是在代码的这一部分(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文件大约是2GB(2147483647字节)。有趣的是,只有当我插入大约800万条记录时才会发生这种情况。有2或3百万的数据库关闭就可以了。插入800万条记录大约需要3个小时,因为我从文本文件中读取数据。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:3)

刚刚解决了问题。 我使用的是32位系统,TC只能在这样的系统中处理高达2GB的数据库。 解决方案是使用“--enable-off64”选项构建TC。像这样:

./configure --enable-off64
make
make install