2009-08-27 1 views
1

TC 해시 데이터베이스에 약 800 만 레코드를 삽입 한 후 세그먼트 오류가 발생합니다. 모든 삽입 후 나는 DB를 닫습니다하지만 난 코드 (tchdb.c)의이 부분에서 분할의 오류를 잡았 :TokyoCabinet : hdb-> close()의 분할 오류

주석 라인에서 especifically
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의 (2,147,483,647 바이트)에 관한 것입니다 :

tchdbopen(hdb, db_file, HDBOWRITER | HDBOCREAT)) 

DB를은으로 두시면됩니다. 흥미로운 점은 약 800 만 건의 레코드를 삽입 할 때만 발생한다는 것입니다. 2 ~ 3 백만 명의 DB가 정상적으로 종료됩니다. 8 백만 건의 레코드를 삽입하는 데는 텍스트 파일에서 데이터를 읽는 데 약 3 시간이 걸립니다.

아이디어가 있으십니까?

감사합니다.

답변

3

방금 ​​문제가 해결되었습니다. 저는 32 비트 시스템을 사용하고 있으며 TC는 이러한 시스템에서 데이터베이스를 최대 2GB까지만 처리 할 수 ​​있습니다. 해결책은 "--enable-off64"옵션을 사용하여 TC를 빌드하는 것입니다. 다음과 같은 내용 :

./configure --enable-off64 
make 
make install