levelDB 시간 범위 검색

levelDB 는 구 글 의 오픈 소스 키 - value 저장 시스템 으로 성능 이 높 고 디자인 사상 이 절묘 하 며 사용 하기 도 간단 하 다.그러나 절대 다수의 No Sql 데이터베이스 처럼 단일 한 조회 만 할 수 있 고 복잡 한 관계 조합 조 회 를 감당 할 수 없다.실제 프로젝트 에서 저 희 는 levelDB 를 응용 하여 한동안 데이터 검색 을 해 야 합 니 다.따라서 시간 가감 을 통 해 완 성 된 이 기능 은 간단 한 코드 를 붙 여 참고 하 시기 바 랍 니 다.
http://vcsky.net  by havenzhao
데이터 삽입 함수 먼저 보기:
int InsertLevelDB(const char* key, const char* content) 
{ 
    //const char* Content = "2011-03-18   10:15:10,1.16591,2.27857,3.37197,4.45305,3.37197,1.16591,2.27857,3.37197,4.45305,5.52507,5.52507,4.45305,4.45305,4.45305,4.45305"; 
    leveldb::DB* db = NULL; 
    leveldb::Options options; 
    options.create_if_missing = true; 
    options.write_buffer_size = 8 * 1024* 1024; 
    leveldb::Status status = leveldb::DB::Open(options, "c:/tmp/testdb", &db);
    leveldb::WriteOptions wo; 
    wo.sync = false; 
    if (status.ok()) 
    { 
    //    cout << "write key: " << key << endl; 
        leveldb::Status s = db->Put(wo, key, content); 
    } 
    else 
    { 
        printf("Insert LevelDB error\r
"); } delete db; return 0; }

그 중에서 키 의 형성 은 device 를 통 해id + 타임 스탬프 (time t 형식)
void GetKey(int device_id, time_t time_stamp, char* key) 
{ 
    char id[20]; 
    _itoa_s(device_id, id, 10); 
    strcpy_s(key, 50, id); 
    char *timeStamp = TimeToChar(time_stamp); //        
    strcat_s(key, 50, timeStamp); 
}

시간 시작 지점 에 따라 데 이 터 를 검색 하 는데 주로 timet 와 struct tm 의 특성 은 시간의 가감 을 통 해 키 값 을 형성 하여 value 값 을 얻어 value 집합 에 저장한다.
int QueryData(int device_id, time_t begin_time, time_t end_time, vector<string>& history_data) 
{ 
    leveldb::DB* db = NULL; 
    leveldb::Options options; 
    options.create_if_missing = true; 
    options.write_buffer_size = 8 * 1024* 1024; 
    leveldb::Status status = leveldb::DB::Open(options, "c:/tmp/testdb", &db); 
    if (!status.ok()) 
    { 
        delete db; 
        printf("Insert LevelDB error\r
"); return -1; } time_t cur_time = begin_time ; struct tm *beginTime, *curTime; curTime = localtime(&begin_time); char key[100]; string content; while(cur_time <= end_time) // key, value { curTime->tm_sec += 1; cur_time = mktime(curTime); memset(key, 0, sizeof(key)); GetKey(device_id, cur_time, key); leveldb::ReadOptions ro; leveldb::Status s = db->Get(ro, key, &content); if (!content.empty()) { history_data.push_back(content.c_str()); } } delete db; return 0; }

이상 은 대체적인 사고방식 이다. 키 값 에 시간 이 포함 되 어 있 기 때문에 이 루어 진 범위 검색 이다. http://vcsky.net  by havenzhao

좋은 웹페이지 즐겨찾기