1

TC ハッシュ データベースに約 800 万件のレコードを挿入した後、セグメンテーション エラーが発生しました。すべてが挿入された後、DB を閉じますが、コードのこの部分 (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;
}

特にコメント行で。

DBは次のように開かれました:

tchdbopen(hdb, db_file,  HDBOWRITER | HDBOCREAT))

DB は次のように調整されます。

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

.tch ファイルは約 2GB (2147483647 バイト) です。興味深いのは、約 800 万件のレコードを挿入した場合にのみ発生していることです。200 万または 300 万で、DB は問題なく終了します。テキスト ファイルからデータを読み取るため、800 万件のレコードを挿入するには約 3 時間かかります。

何か案は?

ありがとう

4

1 に答える 1

3

問題を解決しました。私は 32 ビット システムを使用していますが、TC はそのようなシステムで最大 2GB のデータベースしか処理できません。解決策は、「--enable-off64」オプションを使用して TC を構築することです。このようなもの:

./configure --enable-off64
make
make install
于 2009-08-28T03:49:01.273 に答える