赞
踩
一.设计目的
在xx项目中,需要载入多张表并对表做关联,然后后面查询使用。但是由于每次系统启动时候都要加载多张表本分析表的关系,所以在每次系统启动的时候,都要卡一下,并且有时候表很大,而分配给系统的内存又有限。为了解决上诉等问题,设计了一种方法,就是索引加数据库方法,下面是索引的基本设计(数据库不是我做的,数据库主要使用了文件映射技术来解决内存压力)。
注:本文数据库指数据的集合,只包含数据。
二.构成
(1)FileHandler类。该类对索引文件做控制。类由自己创建,在第一次初始化数据库之后,执行一次写索引,将索引内容写出到文件。以后每次启动都通过读索引来加载。
(2)Info类。这是一个简化,实际Info类做了多层嵌套(数据的索引层次太多了)。Info类保存了本级的id值和内部数据(可能是个map,或者vector之类)。
(3)IndexBuilder类。这个类负责在初始化的时候,反复从数据库取得索引信息,并将索引信息记录进map。
(4)Index类。这个类读取所以呢的文件,并提供查询方法。
三.实现
- typedef vector<size_t> Container;
-
-
- class FileHandler{
- private:
- FileHandler();
- public:
- auto_ptr<FileHandler> createFileHandler();
- void writeOneKey(const char*);
- void writeOneVal(const char*);
- void writeValList(const Container&);
- char readOneKey();
- char readOneVal();
- void readValList(size_t, Container&);
- private:
- FILE* key;
- FILE* val;
- };
-
-
- class Info{
- public:
- Info(size_t);
- private:
- NONE_COPY_AND_ASSIGN(Info);
- public:
- void addIndexInfo(const IndexInfo&);
- void getIndexInfo(IndexInfo&);
- void saveToFile();
- void loadFromFile();
- size_t getId();
- private:
- size_t id;
- Container contain;
- };
-
-
- class IndexBuilder{
- public:
- IndexBuilder(const PARAM&);
- private:
- NONE_COPY_AND_ASSIGN(IndexBuilder);
- public:
- void addIndex(const Index&);
- void saveToFile();
- private:
- map<size_t, Info> infos;
- FileHandler* files;
- };
-
-
- class Index{
- public:
- Index(const string&);
- private:
- NONE_COPY_AND_ASSIGN(Index);
- public:
- void getIndex(size_t, Index&);
- void loadFromFile();
- private:
- map<size_t, Info> infos;
- FileHandler* files;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。