2009-08-27 10 views
1

TCハッシュデータベースに約800万レコードを挿入した後、セグメンテーションフォールトに陥りました。すべてが挿入された後、私はDBを閉じる私はコード(tchdb.c)のこの部分でセグメンテーション違反をキャッチ:especificallyコメント行でTokyoCabinet:hdb-> close()のセグメンテーションフォールト

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は次のように開いた:

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

.tchファイルが2GB(2147483647バイト)程度である。

tchdbopen(hdb, db_file, HDBOWRITER | HDBOCREAT)) 

DBを用いてtunnedれます。興味深いのは、約800万レコードを挿入したときだけ起こっているということです。 2〜3百万人がDBを完全に閉鎖します。テキストファイルからデータを読み込むので、800万レコードを挿入するのに約3時間かかります。

アイデア?

ありがとう

答えて

3

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

./configure --enable-off64 
make 
make install 
関連する問題