Falha de segmentação no hdb-> close (): TokyoCabinet

votos
1

Eu estou preso em uma falha de segmentação após a inserção de cerca de 8 milhões de registros em um banco de dados TC Hash. Depois que tudo estiver inserido I fechar a DB, mas eu peguei uma falha de segmentação nesta parte do código (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;
}

Mais especificamente na linha comentada.

O DB foi aberto como este:

tchdbopen(hdb, db_file,  HDBOWRITER | HDBOCREAT))

A DB é tunned com:

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

O arquivo .tch é de cerca de 2 GB (2147483647 bytes). O interessante é que ele só está acontecendo quando eu inserir cerca de 8 milhões de discos. Com 2 ou 3 milhões a DB fecha bem. Inserção de 8 milhões de registros leva cerca de 3 horas, porque eu ler dados de arquivos de texto.

Alguma ideia?

obrigado

Publicado 27/08/2009 em 04:01
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Apenas resolveu o problema. Eu estou em um sistema de 32bits e TC só pode lidar com bancos de dados de até 2GB de tais sistemas. A solução é a construção de TC com a opção "--enable-off64". Algo assim:

./configure --enable-off64
make
make install
Respondeu 28/08/2009 em 04:49
fonte usuário

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